nodejs에서 사용되는 setTimeout 함수에 대해 알아보자. 언제한번 동아리에 지원할 때 저 함수에 대해 물어본 적이 있었다. 그 당시에 몰랐기에 구글링해서 지원했었다는...
setTimeout 함수는 쉽게 말해 예약제라고 보면 좋을 것 같다. 흔히 말해 호출 스케줄링이라고 하는데,
setTimeout(func, delay, arg1, arg2, ...)
- func : 호출하고자 하는 콜백함수
- delay : 지연시키고자 하는 시간 (단위: ms)
- arg1, arg2, ... : 호출하는 콜백함수의 인자값
예를 들어
function sayHi(who, phrase) {
alert( who + ' 님, ' + phrase );
}
setTimeout(sayHi, 1000, "홍길동", "안녕하세요."); // 홍길동 님, 안녕하세요.
즉 1초 후에 홍길동, 안녕하세요 인자값을 sayHi 함수에게 넘겨주며 실행된다.
setTimeout 여러개일 경우
setTimeout( () => { console.log('j'); aaa(); }, 2000 ); // 1
setTimeout( () => { console.log('a'); aaa1(); }, 2000 ); // 2
setTimeout( () => { console.log('v'); aaa(); }, 0 ); // 3
const aaa = () => {
setTimeout( () => { console.log('d'); }, 0);
console.log('c');
};
const aaa1 = () => {
setTimeout( () => { console.log('d1'); }, 0);
console.log('c1');
};
✋ 기본적으로 setTimeout 함수간의 순서는 딜레이 시간이 기준이다. 즉 위와 같은 코드에서 3 -> 1 -> 2 순서로 실행된다. 또한, 메모리에 같이 쌓인 다른 함수를 먼저 실행시키고 나서 딜레이 시간을 가진 후에 setTimeout 함수를 실행하게 된다.
v c d j c a c1 d d1
setTimeout 중첩인 경우
const fs = require('fs');
const aaa = () => {
setTimeout( () => { console.log('d'); }, 0);
console.log('c');
};
setTimeout( () => {
fs.readFile('any.txt', () => {
setTimeout(() => {
console.log('e');
}, 0);
setImmediate(() => {
console.log('f');
});
});
}, 100 );
setTimeout( () => { console.log('a'); aaa(); }, 0 );
Promise.resolve().then( () => { aaa(); console.log('b'); });
c b a c d d f e
✋ 코드를 보면 처음에 aaa함수를 정의한 부분 아래 부터 진행이 되는데, 두개의 setTimeout함수를 보면 하나는 딜레이 100ms, 하나는 딜레이 0ms이다. 여기서 주의할 것이 딜레이가 0ms라고 바로 실행하는 것이 아니라 여기서 말하는 딜레이는 예약제라고 생각하면 편하다. 즉, 딜레이가 0ms인 setTimeout 함수
가 딜레이가 100ms인 setTimeout함수
보다 먼저 실행된다는 뜻이다. 하지만 setTimeout함수는 기본적으로 예약되어있는 함수의 실행을 먼저 실행시키기 때문에 Promise.resolve.then
을 먼저 실행하게 된다.