지금 만드는 프로젝트에서 기능하나 만들어야 했는데

서버에서 특정시간마다 로직 수행하고 결과를 클라한테 보내고 다시 몇초있다 보내는 

반복을 해야하는 상황이었음



쉽게 설명하자면 위 룰렛판처럼

1~10까지 숫자가 있다면


1에서 몇초있다가 2로 넘어가고 결과를 리스폰스,

2에서 몇초있다가 3으로 넘어가고 결과를 리스폰스,

.

.

.

10에서 몇초있다가 1로 돌아가고 결과를 리스폰스

이런식으로 계속 루프를 돌아야 하는 상황임

(나중에 이 루프를 취소도 해야함)



이걸 어캐 구현해야하나 고민하다가 재귀함수로 한번 짜봤음

실제 코드는 이렇게 생김



배열을 받아서 다음 사람에게 턴(순번)을 넘기고

socket.io로 이벤트를 방출시키는 그런 함수임

그리고 막 2줄,

setTimer()는 setTimeout으로 resolve 반환하는 프로미스임

시간 지나면 막줄로 자신을 다시 호출해서 반복하는 방식임

이걸 호출하면 의도했던대로 정해진 시간마다 순서가 계속 바뀜




왜 재귀함수로 만들었냐면


첫번째로 솔직히 반복문으론 어떻게 구현할줄 모르겠음

위의 룰렛예제 처럼 계속해서 배열안 요소에 순번을 조작하고 몇초 기다렸다 리스폰스 해야하는데

어캐 해야할지 모르겠음 그리고 나중에 그 반복문을 취소해야 할때도 있는데 돌고있는반복문을 어캐 취소하는지도 모름


두번째로 코드가 명확함

코드를 반복해야하는데 마치 goto를 쓰는것처럼

다시 위의 코드로 돌아가 반복하는게

딱보면 '아 그렇게 되는구나' 하고 명확하게 이해가 가능함  



근데 재귀함수가 반복문보다 느리고 메모리 잡아먹는다 라는 말도 있더라

함수안에서 또 함수를 계속호출하는건데 스택이 계속 쌓이는거니까 그말도 당연함

한가지 골때리는게 위 재귀함수를 취소하는 방법인데



이딴식으로 동작함

그니까 함수를 return으로 종료시키는게 아니라

setTimeout을 끝내버려서 저 프로미스가 아예 응답을 안하고 멈춰버리고

await이 무한 대기하면서 아래의 코드는 실행이 안돼는 방식임

재귀함수가 안끝나고 스택쌓인상태로 그대로 남아있는다 이 말임




지금 진행하는 프로젝트가 포폴용 갠프라 중요한건 아닌데

지금 내가 저렇게 만들어놓은게 제대로된건지 모르겠음

일단 내가 의도한대로 동작은 하지만

메모리에 계속 스택 쌓이고 누수될거같기도 하고 여튼 존나 어렵고 잘 모르겠음