node api 의 callback 함수들은 비동기로 동작

setInterval

let num = 1;
const interval = setInterval(() => {
  console.log(num++);
}, 1000);
*// 1000ms 마다 callback 함수를 수행*

setTimeout(() => {
  console.log("Timeout");
  clearInterval(interval); // setInterval 종료 함수
}, 6000);

/*[출력 결과]
1
2
3
4
5
Timeout
*/

setImmediate

인수로 전달된 모든 함수는 이벤트 루프의 다음 반복에서 실행되는 콜백입니다.

console.log('code1');
setTimeout(() => {
  console.log('setTimeout 0');
}, 0);

console.log('code2');
setImmediate(() => {
  console.log('setImmediate');
});

console.log('code3');
process.nextTick(() => {
  console.log('process.nextTick');
});

/*
	[출력 결과]
	code1
	code2
	code3
	nextTick
	setTimeout 0
	setImmediate
*/

처리 순서

  1. Call Stack 에 있는 log가 먼저 처리되고

  2. Task Queue에 setTimeout, setImmediate, nextTick 의 node api 함수들이 Call Stack으로 옮겨져 하나씩 처리 된다.

  3. nextTick은 Task Queue의 맨 처음으로 처리되고, 다음으로

  4. 실행 컨텍스트의 호출 순서대로 setTimeout, setImmediate 순으로 실행된다. 하지만 비동기의 처리가 완료되는 순서는 nextTick을 제외하고는 무엇이 더 먼저 출력 될지는 보장할 수 없다.

    ( setTimeout 보다 setImmediate 가 먼저 처리되어 출력 될 수 있다. )