Skip to content

타이머

[안정성: 2 - 안정적]

안정성: 2 안정성: 2 - 안정적

소스 코드: lib/timers.js

timer 모듈은 특정 시점에 호출될 함수를 예약하기 위한 전역 API를 제공합니다. 타이머 함수는 전역이므로 API를 사용하기 위해 require('node:timers')를 호출할 필요가 없습니다.

Node.js 내의 타이머 함수는 웹 브라우저에서 제공하는 타이머 API와 유사한 API를 구현하지만 Node.js 이벤트 루프를 기반으로 구축된 다른 내부 구현을 사용합니다.

클래스: Immediate

이 객체는 내부적으로 생성되며 setImmediate()에서 반환됩니다. 예약된 작업을 취소하기 위해 clearImmediate()에 전달할 수 있습니다.

기본적으로 즉시 실행이 예약되면 Node.js 이벤트 루프는 즉시 실행이 활성 상태인 동안 계속 실행됩니다. setImmediate()에서 반환된 Immediate 객체는 이 기본 동작을 제어하는 데 사용할 수 있는 immediate.ref()immediate.unref() 함수를 모두 내보냅니다.

immediate.hasRef()

추가된 버전: v11.0.0

true이면 Immediate 객체는 Node.js 이벤트 루프를 활성 상태로 유지합니다.

immediate.ref()

추가된 버전: v9.7.0

호출되면 Immediate가 활성 상태인 동안 Node.js 이벤트 루프가 종료 되지 않도록 요청합니다. immediate.ref()를 여러 번 호출해도 아무런 효과가 없습니다.

기본적으로 모든 Immediate 객체는 "참조됨"이므로 이전에 immediate.unref()가 호출되지 않은 경우 일반적으로 immediate.ref()를 호출할 필요가 없습니다.

immediate.unref()

Added in: v9.7.0

호출되면 활성 Immediate 객체는 Node.js 이벤트 루프가 활성 상태를 유지하는 데 필요하지 않습니다. 이벤트 루프를 계속 실행하는 다른 활동이 없으면 Immediate 객체의 콜백이 호출되기 전에 프로세스가 종료될 수 있습니다. immediate.unref()를 여러 번 호출해도 아무런 효과가 없습니다.

immediate[Symbol.dispose]()

Added in: v20.5.0, v18.18.0

[Stable: 1 - Experimental]

Stable: 1 Stability: 1 - 실험적

immediate를 취소합니다. 이는 clearImmediate()를 호출하는 것과 유사합니다.

클래스: Timeout

이 객체는 내부적으로 생성되며 setTimeout()setInterval()에서 반환됩니다. 예약된 작업을 취소하기 위해 clearTimeout() 또는 clearInterval()에 전달할 수 있습니다.

기본적으로 setTimeout() 또는 setInterval()을 사용하여 타이머가 예약되면 타이머가 활성 상태인 동안 Node.js 이벤트 루프는 계속 실행됩니다. 이러한 함수에서 반환된 각 Timeout 객체는 이 기본 동작을 제어하는 데 사용할 수 있는 timeout.ref()timeout.unref() 함수를 모두 내보냅니다.

timeout.close()

Added in: v0.9.1

[Stable: 3 - Legacy]

Stable: 3 Stability: 3 - 레거시: 대신 clearTimeout()을 사용하십시오.

타임아웃을 취소합니다.

timeout.hasRef()

Added in: v11.0.0

true이면 Timeout 객체가 Node.js 이벤트 루프를 활성 상태로 유지합니다.

timeout.ref()

추가된 버전: v0.9.1

  • 반환값: <Timeout> timeout에 대한 참조

호출되면 Timeout이 활성 상태인 동안 Node.js 이벤트 루프가 종료되지 않도록 요청합니다. timeout.ref()를 여러 번 호출해도 아무런 효과가 없습니다.

기본적으로 모든 Timeout 객체는 "ref'ed" 상태이므로 이전에 timeout.unref()를 호출하지 않은 경우 일반적으로 timeout.ref()를 호출할 필요가 없습니다.

timeout.refresh()

추가된 버전: v10.2.0

  • 반환값: <Timeout> timeout에 대한 참조

타이머의 시작 시간을 현재 시간으로 설정하고, 타이머가 현재 시간에 맞게 조정된 이전 지정된 기간에 콜백을 호출하도록 다시 예약합니다. 이는 새 JavaScript 객체를 할당하지 않고 타이머를 새로 고치는 데 유용합니다.

콜백을 이미 호출한 타이머에서 이 기능을 사용하면 타이머가 다시 활성화됩니다.

timeout.unref()

추가된 버전: v0.9.1

  • 반환값: <Timeout> timeout에 대한 참조

호출되면 활성 Timeout 객체는 Node.js 이벤트 루프가 활성 상태를 유지하는 데 필요하지 않습니다. 이벤트 루프를 계속 실행하는 다른 활동이 없으면 Timeout 객체의 콜백이 호출되기 전에 프로세스가 종료될 수 있습니다. timeout.unref()를 여러 번 호출해도 아무런 효과가 없습니다.

timeout[Symbol.toPrimitive]()

추가된 버전: v14.9.0, v12.19.0

  • 반환값: <integer>timeout을 참조하는 데 사용할 수 있는 숫자

Timeout을 원시 값으로 강제 변환합니다. 원시 값은 Timeout을 지우는 데 사용할 수 있습니다. 원시 값은 타임아웃이 생성된 동일한 스레드에서만 사용할 수 있습니다. 따라서 worker_threads에서 사용하려면 먼저 올바른 스레드로 전달해야 합니다. 이를 통해 브라우저 setTimeout()setInterval() 구현과의 호환성이 향상됩니다.

timeout[Symbol.dispose]()

추가된 버전: v20.5.0, v18.18.0

[안정성: 1 - 실험적]

안정성: 1 안정성: 1 - 실험적

타임아웃을 취소합니다.

타이머 스케줄링

Node.js의 타이머는 특정 시간이 지난 후 주어진 함수를 호출하는 내부 구조입니다. 타이머의 함수가 호출되는 시점은 타이머를 생성하는 데 사용된 메서드와 Node.js 이벤트 루프가 수행 중인 다른 작업에 따라 다릅니다.

setImmediate(callback[, ...args])

[기록]

버전변경 사항
v18.0.0callback 인수에 유효하지 않은 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 오류가 발생합니다.
v0.9.1추가됨: v0.9.1

I/O 이벤트 콜백 후 callback의 "즉시" 실행을 예약합니다.

setImmediate()에 대한 여러 호출이 이루어지면 callback 함수는 생성된 순서대로 실행되도록 대기열에 추가됩니다. 전체 콜백 대기열은 모든 이벤트 루프 반복에서 처리됩니다. 실행 중인 콜백 내부에서 즉시 타이머가 대기열에 추가되면 해당 타이머는 다음 이벤트 루프 반복까지 트리거되지 않습니다.

callback이 함수가 아니면 TypeError가 발생합니다.

이 메서드에는 timersPromises.setImmediate()를 사용하여 사용할 수 있는 Promise에 대한 사용자 정의 변형이 있습니다.

setInterval(callback[, delay[, ...args]])

[기록]

버전변경 사항
v18.0.0callback 인수에 유효하지 않은 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE 오류가 발생합니다.
v0.0.1추가됨: v0.0.1
  • callback <Function> 타이머가 경과하면 호출할 함수입니다.
  • delay <number> callback을 호출하기 전에 대기할 시간(밀리초)입니다. 기본값: 1.
  • ...args <any> callback이 호출될 때 전달할 선택적 인수입니다.
  • 반환값: clearInterval()와 함께 사용할 <Timeout>

delay 밀리초마다 callback의 반복 실행을 예약합니다.

delay2147483647보다 크거나 1보다 작거나 NaN이면 delay1로 설정됩니다. 정수가 아닌 지연은 정수로 잘립니다.

callback이 함수가 아니면 TypeError가 발생합니다.

이 메서드에는 timersPromises.setInterval()를 사용하여 사용할 수 있는 Promise에 대한 사용자 정의 변형이 있습니다.

setTimeout(callback[, delay[, ...args]])

[기록]

버전변경 사항
v18.0.0callback 인수에 유효하지 않은 콜백을 전달하면 이제 ERR_INVALID_CALLBACK 대신 ERR_INVALID_ARG_TYPE을 던집니다.
v0.0.1v0.0.1에 추가됨
  • callback <Function> 타이머가 경과되면 호출할 함수입니다.
  • delay <number> callback을 호출하기 전에 대기할 시간(밀리초)입니다. 기본값: 1.
  • ...args <any> callback이 호출될 때 전달할 선택적 인수입니다.
  • 반환: clearTimeout()에 사용할 <Timeout>

delay 밀리초 후에 일회성 callback 실행을 예약합니다.

callback은 정확히 delay 밀리초 내에 호출되지 않을 수 있습니다. Node.js는 콜백이 실행되는 정확한 시간 또는 순서에 대해 보장하지 않습니다. 콜백은 지정된 시간에 최대한 가깝게 호출됩니다.

delay2147483647보다 크거나 1보다 작거나 NaN이면 delay1로 설정됩니다. 정수가 아닌 지연은 정수로 잘립니다.

callback이 함수가 아니면 TypeError가 발생합니다.

이 메서드에는 timersPromises.setTimeout()를 사용하여 사용할 수 있는 프로미스에 대한 사용자 지정 변형이 있습니다.

타이머 취소

setImmediate(), setInterval()setTimeout() 메서드는 각각 예약된 타이머를 나타내는 객체를 반환합니다. 이러한 객체를 사용하여 타이머를 취소하고 트리거되지 않도록 할 수 있습니다.

setImmediate()setTimeout()의 프로미스화된 변형의 경우 AbortController를 사용하여 타이머를 취소할 수 있습니다. 취소되면 반환된 Promise는 'AbortError'와 함께 거부됩니다.

setImmediate()의 경우:

js
import { setImmediate as setImmediatePromise } from 'node:timers/promises';

const ac = new AbortController();
const signal = ac.signal;

// Promise를 `await`하지 않으므로 `ac.abort()`가 동시에 호출됩니다.
setImmediatePromise('foobar', { signal })
  .then(console.log)
  .catch((err) => {
    if (err.name === 'AbortError')
      console.error('The immediate was aborted');
  });

ac.abort();
js
const { setImmediate: setImmediatePromise } = require('node:timers/promises');

const ac = new AbortController();
const signal = ac.signal;

setImmediatePromise('foobar', { signal })
  .then(console.log)
  .catch((err) => {
    if (err.name === 'AbortError')
      console.error('The immediate was aborted');
  });

ac.abort();

setTimeout()의 경우:

js
import { setTimeout as setTimeoutPromise } from 'node:timers/promises';

const ac = new AbortController();
const signal = ac.signal;

// Promise를 `await`하지 않으므로 `ac.abort()`가 동시에 호출됩니다.
setTimeoutPromise(1000, 'foobar', { signal })
  .then(console.log)
  .catch((err) => {
    if (err.name === 'AbortError')
      console.error('The timeout was aborted');
  });

ac.abort();
js
const { setTimeout: setTimeoutPromise } = require('node:timers/promises');

const ac = new AbortController();
const signal = ac.signal;

setTimeoutPromise(1000, 'foobar', { signal })
  .then(console.log)
  .catch((err) => {
    if (err.name === 'AbortError')
      console.error('The timeout was aborted');
  });

ac.abort();

clearImmediate(immediate)

추가된 버전: v0.9.1

setImmediate()에서 생성된 Immediate 객체를 취소합니다.

clearInterval(timeout)

추가된 버전: v0.0.1

setInterval()에서 생성된 Timeout 객체를 취소합니다.

clearTimeout(timeout)

추가된 버전: v0.0.1

setTimeout()에서 생성된 Timeout 객체를 취소합니다.

타이머 프로미스 API

[기록]

버전변경 사항
v16.0.0실험적 단계에서 졸업
v15.0.0추가된 버전: v15.0.0

timers/promises API는 Promise 객체를 반환하는 타이머 함수 세트를 제공합니다. API는 require('node:timers/promises')를 통해 접근할 수 있습니다.

js
import {
  setTimeout,
  setImmediate,
  setInterval,
} from 'node:timers/promises';
js
const {
  setTimeout,
  setImmediate,
  setInterval,
} = require('node:timers/promises');

timersPromises.setTimeout([delay[, value[, options]]])

Added in: v15.0.0

  • delay <number> 프라미스가 이행되기 전에 기다릴 밀리초 단위의 시간입니다. 기본값: 1.
  • value <any> 프라미스가 이행될 때 사용될 값입니다.
  • options <Object>
    • ref <boolean> 예약된 Timeout이 Node.js 이벤트 루프가 활성 상태로 유지되도록 요구하지 않아야 함을 나타내려면 false로 설정합니다. 기본값: true.
    • signal <AbortSignal> 예약된 Timeout을 취소하는 데 사용할 수 있는 선택적 AbortSignal입니다.
js
import {
  setTimeout,
} from 'node:timers/promises';

const res = await setTimeout(100, 'result');

console.log(res);  // 'result' 출력
js
const {
  setTimeout,
} = require('node:timers/promises');

setTimeout(100, 'result').then((res) => {
  console.log(res);  // 'result' 출력
});

timersPromises.setImmediate([value[, options]])

Added in: v15.0.0

  • value <any> 프라미스가 이행될 때 사용될 값입니다.
  • options <Object>
    • ref <boolean> 예약된 Immediate가 Node.js 이벤트 루프가 활성 상태로 유지되도록 요구하지 않아야 함을 나타내려면 false로 설정합니다. 기본값: true.
    • signal <AbortSignal> 예약된 Immediate를 취소하는 데 사용할 수 있는 선택적 AbortSignal입니다.
js
import {
  setImmediate,
} from 'node:timers/promises';

const res = await setImmediate('result');

console.log(res);  // 'result' 출력
js
const {
  setImmediate,
} = require('node:timers/promises');

setImmediate('result').then((res) => {
  console.log(res);  // 'result' 출력
});

timersPromises.setInterval([delay[, value[, options]]])

Added in: v15.9.0

delay ms 간격으로 값을 생성하는 비동기 이터레이터를 반환합니다. reftrue인 경우 이벤트 루프를 활성 상태로 유지하려면 비동기 이터레이터의 next()를 명시적으로 또는 암시적으로 호출해야 합니다.

  • delay <number> 반복 간에 대기할 밀리초 수입니다. 기본값: 1.
  • value <any> 이터레이터가 반환하는 값입니다.
  • options <Object>
    • ref <boolean> 반복 간에 예약된 Timeout이 Node.js 이벤트 루프가 활성 상태를 유지하도록 요구하지 않아야 함을 나타내려면 false로 설정합니다. 기본값: true.
    • signal <AbortSignal> 작업 간에 예약된 Timeout을 취소하는 데 사용할 수 있는 선택적 AbortSignal입니다.
js
import {
  setInterval,
} from 'node:timers/promises';

const interval = 100;
for await (const startTime of setInterval(interval, Date.now())) {
  const now = Date.now();
  console.log(now);
  if ((now - startTime) > 1000)
    break;
}
console.log(Date.now());
js
const {
  setInterval,
} = require('node:timers/promises');
const interval = 100;

(async function() {
  for await (const startTime of setInterval(interval, Date.now())) {
    const now = Date.now();
    console.log(now);
    if ((now - startTime) > 1000)
      break;
  }
  console.log(Date.now());
})();

timersPromises.scheduler.wait(delay[, options])

Added in: v17.3.0, v16.14.0

[Stable: 1 - Experimental]

Stable: 1 Stability: 1 - 실험적

  • delay <number> 프로미스가 해결되기 전에 대기할 밀리초 수입니다.

  • options <Object>

    • ref <boolean> 예약된 Timeout이 Node.js 이벤트 루프가 활성 상태를 유지하도록 요구하지 않아야 함을 나타내려면 false로 설정합니다. 기본값: true.
    • signal <AbortSignal> 대기를 취소하는 데 사용할 수 있는 선택적 AbortSignal입니다.
  • 반환값: <Promise>

표준 웹 플랫폼 API로 개발 중인 Scheduling APIs 초안 사양에 의해 정의된 실험적 API입니다.

timersPromises.scheduler.wait(delay, options)를 호출하는 것은 timersPromises.setTimeout(delay, undefined, options)를 호출하는 것과 같습니다.

js
import { scheduler } from 'node:timers/promises';

await scheduler.wait(1000); // 계속하기 전에 1초 동안 기다립니다.

timersPromises.scheduler.yield()

추가된 버전: v17.3.0, v16.14.0

[안정성: 1 - 실험적]

안정성: 1 안정성: 1 - 실험적

Scheduling APIs 초안 명세에 의해 정의된 실험적인 API로, 표준 웹 플랫폼 API로 개발 중입니다.

timersPromises.scheduler.yield()를 호출하는 것은 인자 없이 timersPromises.setImmediate()를 호출하는 것과 같습니다.