Skip to main content

Timers

Stability: 2 - Stable
The timer module exposes a global API for scheduling functions to be called at some future period of time. Because the timer functions are globals, there is no need to call require('node:timers') to use the API. The timer functions within Node.js implement a similar API as the timers API provided by Web Browsers but use a different internal implementation that is built around the Node.js Event Loop.

Class: Immediate

This object is created internally and is returned from setImmediate(). It can be passed to clearImmediate() in order to cancel the scheduled actions. By default, when an immediate is scheduled, the Node.js event loop will continue running as long as the immediate is active. The Immediate object returned by setImmediate() exports both immediate.ref() and immediate.unref() functions that can be used to control this default behavior.

immediate.hasRef()

Added in: v11.0.0
return
boolean
If true, the Immediate object will keep the Node.js event loop active.

immediate.ref()

Added in: v9.7.0
return
Immediate
A reference to immediate
When called, requests that the Node.js event loop not exit so long as the Immediate is active. Calling immediate.ref() multiple times will have no effect. By default, all Immediate objects are “ref’ed”, making it normally unnecessary to call immediate.ref() unless immediate.unref() had been called previously.

immediate.unref()

Added in: v9.7.0
return
Immediate
A reference to immediate
When called, the active Immediate object will not require the Node.js event loop to remain active. If there is no other activity keeping the event loop running, the process may exit before the Immediate object’s callback is invoked. Calling immediate.unref() multiple times will have no effect.

immediateSymbol.dispose

Added in: v20.5.0, v18.18.0. No longer experimental in v24.2.0.
Cancels the immediate. This is similar to calling clearImmediate().

Class: Timeout

This object is created internally and is returned from setTimeout() and setInterval(). It can be passed to either clearTimeout() or clearInterval() in order to cancel the scheduled actions. By default, when a timer is scheduled using either setTimeout() or setInterval(), the Node.js event loop will continue running as long as the timer is active. Each of the Timeout objects returned by these functions export both timeout.ref() and timeout.unref() functions that can be used to control this default behavior.

timeout.hasRef()

Added in: v11.0.0
return
boolean
If true, the Timeout object will keep the Node.js event loop active.

timeout.ref()

Added in: v0.9.1
return
Timeout
A reference to timeout
When called, requests that the Node.js event loop not exit so long as the Timeout is active. Calling timeout.ref() multiple times will have no effect. By default, all Timeout objects are “ref’ed”, making it normally unnecessary to call timeout.ref() unless timeout.unref() had been called previously.

timeout.unref()

Added in: v0.9.1
return
Timeout
A reference to timeout
When called, the active Timeout object will not require the Node.js event loop to remain active. If there is no other activity keeping the event loop running, the process may exit before the Timeout object’s callback is invoked. Calling timeout.unref() multiple times will have no effect.

timeout.refresh()

Added in: v10.2.0
return
Timeout
A reference to timeout
Sets the timer’s start time to the current time, and reschedules the timer to call its callback at the previously specified duration adjusted to the current time. This is useful for refreshing a timer without allocating a new JavaScript object. Using this on a timer that has already called its callback will reactivate the timer.

timeoutSymbol.dispose

Added in: v20.5.0, v18.18.0. No longer experimental in v24.2.0.
Cancels the timeout.

Scheduling Timers

A timer in Node.js is an internal construct that calls a given function after a certain period of time. When a timer’s function is called varies depending on which method was used to create the timer and what other work the Node.js event loop is doing.

setImmediate(callback[, …args])

Added in: v0.9.1
callback
Function
required
The function to call at the end of this turn of the Node.js Event Loop
...args
any
Optional arguments to pass when the callback is called
return
Immediate
For use with clearImmediate()
Schedules the “immediate” execution of the callback after I/O events’ callbacks. When multiple calls to setImmediate() are made, the callback functions are queued for execution in the order in which they are created. The entire callback queue is processed every event loop iteration. If an immediate timer is queued from inside an executing callback, that timer will not be triggered until the next event loop iteration.
console.log('before immediate');

setImmediate((arg) => {
  console.log(`executing immediate: ${arg}`);
}, 'so immediate');

console.log('after immediate');

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

Added in: v0.0.1
callback
Function
required
The function to call when the timer elapses
delay
number
default:"1"
The number of milliseconds to wait before calling the callback
...args
any
Optional arguments to pass when the callback is called
return
Timeout
For use with clearInterval()
Schedules repeated execution of callback every delay milliseconds. When delay is larger than 2147483647 or less than 1 or NaN, the delay will be set to 1. Non-integer delays are truncated to an integer.
function sayHello() {
  console.log('Hello, world!');
}

// Says "Hello, world!" every 2 seconds
setInterval(sayHello, 2000);

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

Added in: v0.0.1
callback
Function
required
The function to call when the timer elapses
delay
number
default:"1"
The number of milliseconds to wait before calling the callback
...args
any
Optional arguments to pass when the callback is called
return
Timeout
For use with clearTimeout()
Schedules execution of a one-time callback after delay milliseconds. The callback will likely not be invoked in precisely delay milliseconds. Node.js makes no guarantees about the exact timing of when callbacks will fire, nor of their ordering. The callback will be called as close as possible to the time specified.
function sayHello() {
  console.log('Hello, world!');
}

// Says "Hello, world!" after 2 seconds
setTimeout(sayHello, 2000);

// Says "Hello, Lydia!" after 2 seconds
setTimeout((name) => {
  console.log(`Hello, ${name}!`);
}, 2000, 'Lydia');
When delay is larger than 2147483647 or less than 1 or NaN, the delay will be set to 1. Non-integer delays are truncated to an integer.

Cancelling Timers

The setImmediate(), setInterval(), and setTimeout() methods each return objects that represent the scheduled timers. These can be used to cancel the timer and prevent it from triggering.

clearImmediate(immediate)

Added in: v0.9.1
immediate
Immediate
required
An Immediate object as returned by setImmediate()
Cancels an Immediate object created by setImmediate().
const immediate = setImmediate(() => {
  console.log('This will not run');
});

clearImmediate(immediate);

clearInterval(timeout)

Added in: v0.0.1
timeout
Timeout | string | number
required
A Timeout object as returned by setInterval() or the primitive of the Timeout object
Cancels a Timeout object created by setInterval().
const interval = setInterval(() => {
  console.log('This will stop after 5 seconds');
}, 1000);

setTimeout(() => {
  clearInterval(interval);
  console.log('Interval cleared');
}, 5000);

clearTimeout(timeout)

Added in: v0.0.1
timeout
Timeout | string | number
required
A Timeout object as returned by setTimeout() or the primitive of the Timeout object
Cancels a Timeout object created by setTimeout().
const timeout = setTimeout(() => {
  console.log('This will not run');
}, 5000);

clearTimeout(timeout);

Timers Promises API

Added in: v15.0.0. Graduated from experimental in v16.0.0.
The timers/promises API provides an alternative set of timer functions that return Promise objects. The API is accessible via require('node:timers/promises').
import {
  setTimeout,
  setImmediate,
  setInterval,
} from 'node:timers/promises';

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

Added in: v15.0.0
delay
number
default:"1"
The number of milliseconds to wait before fulfilling the promise
value
any
A value with which the promise is fulfilled
options
Object
return
Promise
A promise that resolves with the given value after the specified delay.
import { setTimeout } from 'node:timers/promises';

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

console.log(res);  // Prints 'result'

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

Added in: v15.0.0
value
any
A value with which the promise is fulfilled
options
Object
return
Promise
A promise that resolves with the given value.
import { setImmediate } from 'node:timers/promises';

const res = await setImmediate('result');

console.log(res);  // Prints 'result'

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

Added in: v15.9.0
delay
number
default:"1"
The number of milliseconds to wait between iterations
value
any
A value with which the iterator returns
options
Object
return
AsyncIterator
Returns an async iterator that generates values in an interval of delay ms.
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());

Using AbortController with Timers

For the promisified variants of setImmediate() and setTimeout(), an AbortController may be used to cancel the timer. When canceled, the returned Promises will be rejected with an ‘AbortError’. For setImmediate():
import { setImmediate as setImmediatePromise } from '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();
For setTimeout():
import { setTimeout as setTimeoutPromise } from '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();