mirror of
https://github.com/nodejs/node.git
synced 2025-05-09 09:08:46 +00:00

Notable changes: assert: * (SEMVER-MINOR) port common.mustCall() to assert (ConorDavenport) https://github.com/nodejs/node/pull/31982 async_hooks: * (SEMVER-MINOR) add AsyncResource.bind utility (James M Snell) https://github.com/nodejs/node/pull/34574 buffer: * (SEMVER-MINOR) also alias BigUInt methods (Anna Henningsen) https://github.com/nodejs/node/pull/34960 * (SEMVER-MINOR) alias UInt ➡️ Uint in buffer methods (Anna Henningsen) https://github.com/nodejs/node/pull/34729 build: * (SEMVER-MINOR) add build flag for OSS-Fuzz integration (davkor) https://github.com/nodejs/node/pull/34761 cli: * (SEMVER-MINOR) add alias for report-directory to make it consistent (Ash Cripps) https://github.com/nodejs/node/pull/33587 crypto: * (SEMVER-MINOR) allow KeyObjects in postMessage (Tobias Nießen) https://github.com/nodejs/node/pull/33360 * (SEMVER-MINOR) add randomInt function (Oli Lalonde) https://github.com/nodejs/node/pull/34600 deps: * upgrade to libuv 1.39.0 (Colin Ihrig) https://github.com/nodejs/node/pull/34915 * upgrade npm to 6.14.7 (claudiahdz) https://github.com/nodejs/node/pull/34468 * upgrade to libuv 1.38.1 (Colin Ihrig) https://github.com/nodejs/node/pull/34187 dgram: * (SEMVER-MINOR) add IPv6 scope id suffix to received udp6 dgrams (Pekka Nikander) https://github.com/nodejs/node/pull/14500 * (SEMVER-MINOR) allow typed arrays in .send() (Sarat Addepalli) https://github.com/nodejs/node/pull/22413 doc: * (SEMVER-MINOR) Add maxTotalSockets option to agent constructor (rickyes) https://github.com/nodejs/node/pull/33617 * (SEMVER-MINOR) add basic embedding example documentation (Anna Henningsen) https://github.com/nodejs/node/pull/30467 * add Ricky Zhou to collaborators (rickyes) https://github.com/nodejs/node/pull/34676 * add release key for Ruy Adorno (Ruy Adorno) https://github.com/nodejs/node/pull/34628 * add DerekNonGeneric to collaborators (Derek Lewis) https://github.com/nodejs/node/pull/34602 * add AshCripps to collaborators (Ash Cripps) https://github.com/nodejs/node/pull/34494 * add HarshithaKP to collaborators (Harshitha K P) https://github.com/nodejs/node/pull/34417 * add rexagod to collaborators (Pranshu Srivastava) https://github.com/nodejs/node/pull/34457 * add release key for Richard Lau (Richard Lau) https://github.com/nodejs/node/pull/34397 * add danielleadams to collaborators (Danielle Adams) https://github.com/nodejs/node/pull/34360 * add sxa as collaborator (Stewart X Addison) https://github.com/nodejs/node/pull/34338 * add ruyadorno to collaborators (Ruy Adorno) https://github.com/nodejs/node/pull/34297 * (SEMVER-MAJOR) deprecate process.umask() with no arguments (Colin Ihrig) https://github.com/nodejs/node/pull/32499 embedding: * (SEMVER-MINOR) make Stop() stop Workers (Anna Henningsen) https://github.com/nodejs/node/pull/32531 * (SEMVER-MINOR) provide hook for custom process.exit() behaviour (Anna Henningsen) https://github.com/nodejs/node/pull/32531 fs: * (SEMVER-MINOR) implement lutimes (Maël Nison) https://github.com/nodejs/node/pull/33399 http: * (SEMVER-MINOR) add maxTotalSockets to agent class (rickyes) https://github.com/nodejs/node/pull/33617 * (SEMVER-MINOR) return this from IncomingMessage#destroy() (Colin Ihrig) https://github.com/nodejs/node/pull/32789 * (SEMVER-MINOR) expose host and protocol on ClientRequest (wenningplus) https://github.com/nodejs/node/pull/33803 http2: * (SEMVER-MINOR) return this for Http2ServerRequest#setTimeout (Pranshu Srivastava) https://github.com/nodejs/node/pull/33994 * (SEMVER-MINOR) do not modify explicity set date headers (Pranshu Srivastava) https://github.com/nodejs/node/pull/33160 module: * (SEMVER-MINOR) named exports for CJS via static analysis (Guy Bedford) https://github.com/nodejs/node/pull/35249 * (SEMVER-MINOR) exports pattern support (Guy Bedford) https://github.com/nodejs/node/pull/34718 * (SEMVER-MINOR) package "imports" field (Guy Bedford) https://github.com/nodejs/node/pull/34117 * (SEMVER-MINOR) deprecate module.parent (Antoine du HAMEL) https://github.com/nodejs/node/pull/32217 n-api: * (SEMVER-MINOR) create N-API version 7 (Gabriel Schulhof) https://github.com/nodejs/node/pull/35199 * (SEMVER-MINOR) support type-tagging objects (Gabriel Schulhof) https://github.com/nodejs/node/pull/28237 n-api,src: * (SEMVER-MINOR) provide asynchronous cleanup hooks (Anna Henningsen) https://github.com/nodejs/node/pull/34572 perf_hooks: * (SEMVER-MINOR) add idleTime and event loop util (Trevor Norris) https://github.com/nodejs/node/pull/34938 timers: * (SEMVER-MINOR) allow timers to be used as primitives (Denys Otrishko) https://github.com/nodejs/node/pull/34017 tls: * (SEMVER-MINOR) make 'createSecureContext' honor more options (Mateusz Krawczuk) https://github.com/nodejs/node/pull/33974 worker: * (SEMVER-MINOR) add public method for marking objects as untransferable (Anna Henningsen) https://github.com/nodejs/node/pull/33979 * (SEMVER-MINOR) emit `'messagerror'` events for failed deserialization (Anna Henningsen) https://github.com/nodejs/node/pull/33772 * (SEMVER-MINOR) allow passing JS wrapper objects via postMessage (Anna Henningsen) https://github.com/nodejs/node/pull/33772 * (SEMVER-MINOR) allow transferring/cloning generic BaseObjects (Anna Henningsen) https://github.com/nodejs/node/pull/33772 * (SEMVER-MINOR) add option to track unmanaged file descriptors (Anna Henningsen) https://github.com/nodejs/node/pull/34303 * (SEMVER-MINOR) add stack size resource limit option (Anna Henningsen) https://github.com/nodejs/node/pull/33085 worker,fs: * (SEMVER-MINOR) make FileHandle transferable (Anna Henningsen) https://github.com/nodejs/node/pull/33772 zlib: * (SEMVER-MINOR) add `maxOutputLength` option (unknown) https://github.com/nodejs/node/pull/33516 * switch to lazy init for zlib streams (Andrey Pechkurov) https://github.com/nodejs/node/pull/34048 PR-URL: https://github.com/nodejs/node/pull/35401
368 lines
12 KiB
Markdown
368 lines
12 KiB
Markdown
# Timers
|
|
|
|
<!--introduced_in=v0.10.0-->
|
|
|
|
> Stability: 2 - Stable
|
|
|
|
<!-- source_link=lib/timers.js -->
|
|
|
|
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('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()`
|
|
<!-- YAML
|
|
added: v11.0.0
|
|
-->
|
|
|
|
* Returns: {boolean}
|
|
|
|
If true, the `Immediate` object will keep the Node.js event loop active.
|
|
|
|
### `immediate.ref()`
|
|
<!-- YAML
|
|
added: v9.7.0
|
|
-->
|
|
|
|
* Returns: {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()`
|
|
<!-- YAML
|
|
added: v9.7.0
|
|
-->
|
|
|
|
* Returns: {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.
|
|
|
|
## 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()`
|
|
<!-- YAML
|
|
added: v11.0.0
|
|
-->
|
|
|
|
* Returns: {boolean}
|
|
|
|
If true, the `Timeout` object will keep the Node.js event loop active.
|
|
|
|
### `timeout.ref()`
|
|
<!-- YAML
|
|
added: v0.9.1
|
|
-->
|
|
|
|
* Returns: {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.refresh()`
|
|
<!-- YAML
|
|
added: v10.2.0
|
|
-->
|
|
|
|
* Returns: {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.
|
|
|
|
### `timeout.unref()`
|
|
<!-- YAML
|
|
added: v0.9.1
|
|
-->
|
|
|
|
* Returns: {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.
|
|
|
|
Calling `timeout.unref()` creates an internal timer that will wake the Node.js
|
|
event loop. Creating too many of these can adversely impact performance
|
|
of the Node.js application.
|
|
|
|
### `timeout[Symbol.toPrimitive]()`
|
|
<!-- YAML
|
|
added:
|
|
- v14.9.0
|
|
- v12.19.0
|
|
-->
|
|
|
|
* Returns: {integer} a number that can be used to reference this `timeout`
|
|
|
|
Coerce a `Timeout` to a primitive. The primitive can be used to
|
|
clear the `Timeout`. The primitive can only be used in the
|
|
same thread where the timeout was created. Therefore, to use it
|
|
across [`worker_threads`][] it must first be passed to the correct
|
|
thread. This allows enhanced compatibility with browser
|
|
`setTimeout()` and `setInterval()` implementations.
|
|
|
|
## 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])`
|
|
<!-- YAML
|
|
added: v0.9.1
|
|
-->
|
|
|
|
* `callback` {Function} 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.
|
|
* Returns: {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.
|
|
|
|
If `callback` is not a function, a [`TypeError`][] will be thrown.
|
|
|
|
This method has a custom variant for promises that is available using
|
|
[`util.promisify()`][]:
|
|
|
|
```js
|
|
const util = require('util');
|
|
const setImmediatePromise = util.promisify(setImmediate);
|
|
|
|
setImmediatePromise('foobar').then((value) => {
|
|
// value === 'foobar' (passing values is optional)
|
|
// This is executed after all I/O callbacks.
|
|
});
|
|
|
|
// Or with async function
|
|
async function timerExample() {
|
|
console.log('Before I/O callbacks');
|
|
await setImmediatePromise();
|
|
console.log('After I/O callbacks');
|
|
}
|
|
timerExample();
|
|
```
|
|
|
|
### `setInterval(callback, delay[, ...args])`
|
|
<!-- YAML
|
|
added: v0.0.1
|
|
-->
|
|
|
|
* `callback` {Function} The function to call when the timer elapses.
|
|
* `delay` {number} The number of milliseconds to wait before calling the
|
|
`callback`.
|
|
* `...args` {any} Optional arguments to pass when the `callback` is called.
|
|
* Returns: {Timeout} for use with [`clearInterval()`][]
|
|
|
|
Schedules repeated execution of `callback` every `delay` milliseconds.
|
|
|
|
When `delay` is larger than `2147483647` or less than `1`, the `delay` will be
|
|
set to `1`. Non-integer delays are truncated to an integer.
|
|
|
|
If `callback` is not a function, a [`TypeError`][] will be thrown.
|
|
|
|
### `setTimeout(callback, delay[, ...args])`
|
|
<!-- YAML
|
|
added: v0.0.1
|
|
-->
|
|
|
|
* `callback` {Function} The function to call when the timer elapses.
|
|
* `delay` {number} The number of milliseconds to wait before calling the
|
|
`callback`.
|
|
* `...args` {any} Optional arguments to pass when the `callback` is called.
|
|
* Returns: {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.
|
|
|
|
When `delay` is larger than `2147483647` or less than `1`, the `delay`
|
|
will be set to `1`. Non-integer delays are truncated to an integer.
|
|
|
|
If `callback` is not a function, a [`TypeError`][] will be thrown.
|
|
|
|
This method has a custom variant for promises that is available using
|
|
[`util.promisify()`][]:
|
|
|
|
```js
|
|
const util = require('util');
|
|
const setTimeoutPromise = util.promisify(setTimeout);
|
|
|
|
setTimeoutPromise(40, 'foobar').then((value) => {
|
|
// value === 'foobar' (passing values is optional)
|
|
// This is executed after about 40 milliseconds.
|
|
});
|
|
```
|
|
|
|
## 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.
|
|
|
|
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()`:
|
|
|
|
```js
|
|
const util = require('util');
|
|
const setImmediatePromise = util.promisify(setImmediate);
|
|
|
|
const ac = new AbortController();
|
|
const signal = ac.signal;
|
|
|
|
setImmediatePromise('foobar', { signal })
|
|
.then(console.log)
|
|
.catch((err) => {
|
|
if (err.message === 'AbortError')
|
|
console.log('The immediate was aborted');
|
|
});
|
|
|
|
ac.abort();
|
|
```
|
|
|
|
For `setTimeout()`:
|
|
|
|
```js
|
|
const util = require('util');
|
|
const setTimeoutPromise = util.promisify(setTimeout);
|
|
|
|
const ac = new AbortController();
|
|
const signal = ac.signal;
|
|
|
|
setTimeoutPromise(1000, 'foobar', { signal })
|
|
.then(console.log)
|
|
.catch((err) => {
|
|
if (err.message === 'AbortError')
|
|
console.log('The timeout was aborted');
|
|
});
|
|
|
|
ac.abort();
|
|
```
|
|
|
|
### `clearImmediate(immediate)`
|
|
<!-- YAML
|
|
added: v0.9.1
|
|
-->
|
|
|
|
* `immediate` {Immediate} An `Immediate` object as returned by
|
|
[`setImmediate()`][].
|
|
|
|
Cancels an `Immediate` object created by [`setImmediate()`][].
|
|
|
|
### `clearInterval(timeout)`
|
|
<!-- YAML
|
|
added: v0.0.1
|
|
-->
|
|
|
|
* `timeout` {Timeout} A `Timeout` object as returned by [`setInterval()`][].
|
|
|
|
Cancels a `Timeout` object created by [`setInterval()`][].
|
|
|
|
### `clearTimeout(timeout)`
|
|
<!-- YAML
|
|
added: v0.0.1
|
|
-->
|
|
|
|
* `timeout` {Timeout} A `Timeout` object as returned by [`setTimeout()`][].
|
|
|
|
Cancels a `Timeout` object created by [`setTimeout()`][].
|
|
|
|
## Timers Promises API
|
|
|
|
> Stability: 1 - Experimental
|
|
|
|
The `timers/promises` API provides an alternative set of timer functions
|
|
that return `Promise` objects. The API is accessible via
|
|
`require('timers/promises')`.
|
|
|
|
```js
|
|
const timersPromises = require('timers/promises');
|
|
```
|
|
|
|
### `timersPromises.setTimeout(delay\[, value\[, options\]\])`
|
|
|
|
* `delay` {number} The number of milliseconds to wait before resolving the
|
|
`Promise`.
|
|
* `value` {any} A value with which the `Promise` is resolved.
|
|
* `options` {Object}
|
|
* `ref` {boolean} Set to `false` to indicate that the scheduled `Timeout`
|
|
should not require the Node.js event loop to remain active.
|
|
**Default**: `true`.
|
|
* `signal` {AbortSignal} An optional `AbortSignal` that can be used to
|
|
cancel the scheduled `Timeout`.
|
|
|
|
### `timersPromises.setImmediate(\[value\[, options\]\])`
|
|
|
|
* `value` {any} A value with which the `Promise` is resolved.
|
|
* `options` {Object}
|
|
* `ref` {boolean} Set to `false` to indicate that the scheduled `Immediate`
|
|
should not require the Node.js event loop to remain active.
|
|
**Default**: `true`.
|
|
* `signal` {AbortSignal} An optional `AbortSignal` that can be used to
|
|
cancel the scheduled `Immediate`.
|
|
|
|
[Event Loop]: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/#setimmediate-vs-settimeout
|
|
[`AbortController`]: globals.md#globals_class_abortcontroller
|
|
[`TypeError`]: errors.md#errors_class_typeerror
|
|
[`clearImmediate()`]: timers.md#timers_clearimmediate_immediate
|
|
[`clearInterval()`]: timers.md#timers_clearinterval_timeout
|
|
[`clearTimeout()`]: timers.md#timers_cleartimeout_timeout
|
|
[`setImmediate()`]: timers.md#timers_setimmediate_callback_args
|
|
[`setInterval()`]: timers.md#timers_setinterval_callback_delay_args
|
|
[`setTimeout()`]: timers.md#timers_settimeout_callback_delay_args
|
|
[`util.promisify()`]: util.md#util_util_promisify_original
|
|
[`worker_threads`]: worker_threads.md
|