← Back to NOTES 🌰 ← Effective JavaScript 🤿
URL 배열을 받아 하나씩 다운로드를 시도하고 성공할 때까지 반복하는 함수를 작성할 때, 동기 함수라면 일반적인 for 루프를 사용할 수 있다.
비동기 함수에서 단순히 for 루프를 사용하면 downloadAsync 함수가 끝나기 전에 다음 다운로드가 시작된다. 이는 의도한 동작이 아니다.
루프처럼 동작하지만 명시적으로 그렇게 말할 때까지 실행을 계속하지 않는 것을 구현해야 한다. 해결책은 루프를 함수로 구현하여 각 반복을 시작할 때를 결정할 수 있도록 하는 것이다.
재귀 함수를 이용해서 종료와 다음 다운로드 시작을 보장하게 작성할 수 있다.
JavaScript 환경에서 재귀 함수는 자기 자신을 너무 많이 호출하면 콜스택이 터질 수 있다.
그러나 비동기 재귀 함수는 무수히 호출되어도 콜스택이 터지지 않는다. 그 이유는 재귀 함수 안에서 또다시 재귀 함수가 호출되는 부분이 콜백이기 때문이다.