프로그래밍/Node.js

Node.js의 Timers

채윤아빠 2021. 4. 22. 08:24
728x90
반응형

일정 시간 후에, 특정한 작업을 실행하고자 할 때, Timer를 이용하면 편리하게 작업할 수 있습니다.

 

Timers 관련하여 다음 세 개의 함수가 주로 이용됩니다.

  • setTimeout()
  • setInterval()
  • setImmediate()

각 함수들의 차이점들을 하나씩 살펴 보도록 하겠습니다.

setTimeout()

"setTimeout()" 함수는 첫 번째 인자로 만료시간 이후 실행할 함수를 받고, 두 번째 인자로 만료시간 (밀리 초) 설정값을 받습니다. 추가적으로 인자를 더 전달할 수 있는데, 그 인자는 첫 번째 함수의 인자로 전달됩니다.

 

반환값으로는 "setTimeout()" 함수로 생성된 "Tmieout" 객체를 받습니다. 이 함수는 브라우저 JavaScript API의 window.setTimeout()과 비슷하지만, 코드의 문자열을 실행하려고 전달할 수 없습니다.

function myTimeout(arg) {
    console.log(`myTimeout arg was => ${arg}`);
}

var timeout = setTimeout(myTimeout, 3000, 'extra');
// clearTimeout(timeout); // Timeout 취소

위 코드는 3초 후에 "myTimeout('extra')" 코드가 실행됩니다. "Timeout" 객체의 인스턴스인 timeout 변수를 이용하여 생성 시 설정한 함수 실행하지 않고 변경할 수도 있으며, 실행 전에 취소할 수도 있습니다.

 

"setTimeout()" 함수는 호출 시 설정한 만료시간에 따라 정확한 밀리 초 후 실행되는 것을 보장하지 않는 다는 점을 유의하셔야 합니다. 이벤트 루프를 블로킹하거나 보유하고 있는 다른 실행 코드가 우선순위에 따라 "setTimeout()"의 실행을 미룰 수 있기 때문입니다. 단지 설정한 만료시간다 더 빨리 실행되지는 않는다는 것만 보장합니다.

setInterval()

"setInterval()" 함수는 "setTimeout()" 함수와 용법이 유사합니다. 전달해야하는 인자도 동일하지만, 한 가지 차이점은 "setTimeout()" 함수는 만료시간 이후 한 번만 실행이 되는 것이고, "setInterval()" 함수는 설정한 반복시간 마다 주기적으로 함수가 실행된다는 점입니다.

function myInterval(arg1, arg2) {
    console.log(`myInterval arg1 was => ${arg1}`);
    console.log(`myInterval arg2 was => ${arg2}`);
}

var interval = setInterval(myInterval, 3000, 'arg1', 100);
// clearInterval(interval); // Interval 취소

설정한 반복시간에 따라 주기적으로 실행되는 Interval을 취소할 때는 "clearInterval()" 함수를 이용합니다.

setImmediate()

"setImmediate()" 함수는 앞서 살펴본 "setTimeout()", "setImmediate()"와 호출 인자도 다르고, 실행되는 방식이 약간 다릅니다.

 

"setImmediate()" 함수는 인자로 전달된 func을 "가능한 한" 빨리 실행하여 줍니다. 실행되는 시기는 스케줄러에 현재 실행 중인 스크립트의 처리가 종료된 이후입니다.

 

이런 특징을 이용하면 현재 스크립트의 실행이 종료된 "직후에" 원하는 함수가 실행될 수 있게 할 수 있습니다.

 

아래 예제를 통하여 이러한 특성을 살펴보도록 하겠습니다.

let i = 0;

//setTimeout(() => console.log('i = ', i), 0); // ?
setImmediate(() => console.log('i = ', i)); // ?

for(let j = 0; j < 100000000; j++) {
    i++;
}

위 예제 코드를 실행하면, 그냥 보기에는 "i = 0"이 출력될 것 같으나, 실제 실행한 결과로 출력되는 i 변수의 값은 "100000000" 입니다. 앞서 설명한 것처럼 현재 실행중인 스크립트(for 문)가 종료된 이후에 지정된 작업이 실행되어 i 값이 출력되기 때문입니다.

 

다음에는 setInterval()을 이용하여, setTimeout() 처럼 이용하거나, 반대로 setTimeout() 함수를 이용하여 setInterval() 함수와 유사하게 동작하는 방법에 대해 정리해 보겠습니다.

 

참고 :
https://nodejs.org/ko/docs/guides/timers-in-node/
https://ko.javascript.info/settimeout-setinterval