[Javascript] 비동기 함수

[원본 링크]

자바스크립트에서 실제로 비동기로 동작하는 함수는 총 4개밖에 없다.
바로 setTimeout, setInterval, setImmediate, process.nextTick이다.
이외에 비동기로 동작하는 함수들도 까보면 다 이것들로 동작하고 있을 것이다.



setTimeout

시간을 설정하고, 그 시간이 경과되면 딱 한번 전달받은 콜백함수가 실행되게 하는 함수다.
노드 뿐만 아니라 브라우저단에서도 지원된다.

첫번째 인자가 콜백함수고, 두번째 인자가 타이머를 설정할 밀리초 단위 시간이다.

반환값을 받아서 clearTimeout에 인자로 던져주면 실행되기 전에 삭제할 수도 있다.



setInterval

시간 간격을 설정하고, 그 간격이 지날때마다 계속 콜백함수가 호출되게 하는 함수다.
브라우저에서도 지원된다.

인자 구성은 Timeout과 동일하다. 콜백함수와 주기로 설정할 밀리초 단위 시간값을 받는다.
근데 저러면 무한하게 실행만 된다.

Timeout 등과 조합해서 clear 함수를 사용하면 적절한 시간에 반복을 중단시킬 수도 있다.



setImmediate

setImmediate는 언뜻보면 setTimeout과 유사한 함수다.
표준함수는 아니고, 노드나 일부 브라우저만 지원한다.

setTimeout과 별로 다르지 않아 보인다.

하지만 이건 setTimeout(콜백, 0)과 같이 즉각적인 비동기 호출을 수행할 때 이점을 보인다.

setTimeout은 타이머에 의해서 관리, 실행이 된다. 그래서 시간이 충분히 지났더라도 스케줄링 문제로 실행이 지연될 경우가 많다.
하지만 이건 타이머에 올리지 않기 때문에 큐에 바로 넣어, 보다 즉각적인 실행을 기대할 수 있다는 장점이 있다.

그래도 뭐, 보통 쓸 일은 없을 것이다.



process.nextTick

노드에만 제공되는 특수한 함수다. 이건 전달받은 함수를 이벤트 루프 다음 칸에서 실행을 시켜준다.

이벤트루프는 노드에서 사용하는 일종의 실행 흐름을 말한다.
그리고 노드는 싱글 스레드이기 때문에.. 1, 2, 3, 입력된 순서대로 차례차례 실행을 시켜준다.
다시말해 이 nextTick은 원래 1칸에 실행할 것을 2칸으로 미뤄버리는 것이다.

그래서 원래 이런 코드는 당연히. foo 함수와 bar 함수가 순서대로 실행된다.

하지만 nextTick을 두면 실행이 지연돼서 실제 동작이 뒤집혀버린다.

이것도 마찬가지로 일반 응용프로그램 구현시에는 거의 쓸 일이 없긴 할 것이다.