Таймеры
Исходный код: lib/timers.js
Модуль timer предоставляет глобальный API для планирования вызова функций в будущем. Поскольку функции таймеров являются глобальными, для использования API не нужно вызывать require('node:timers').
Функции таймеров в Node.js реализуют API, похожий на API таймеров веб-браузеров, но используют другую внутреннюю реализацию, построенную на основе цикла событий Node.js.
Класс: Immediate
Этот объект создается внутри системы и возвращается из setImmediate(). Его можно передать в clearImmediate(), чтобы отменить запланированные действия.
По умолчанию, когда планируется немедленный вызов, цикл событий Node.js продолжает работать, пока этот вызов активен. Объект Immediate, возвращаемый из setImmediate(), экспортирует функции immediate.ref() и immediate.unref(), которые можно использовать для управления этим поведением по умолчанию.
immediate.hasRef()
- Возвращает: <boolean>
Если значение равно true, объект Immediate будет поддерживать активность цикла событий Node.js.
immediate.ref()
- Возвращает: <Immediate> ссылку на
immediate
При вызове запрашивает, чтобы цикл событий Node.js не завершался, пока активен объект Immediate. Повторный вызов immediate.ref() не оказывает эффекта.
По умолчанию все объекты Immediate являются «ref'ed», поэтому обычно вызывать immediate.ref() не требуется, если ранее не был вызван immediate.unref().
immediate.unref()
- Возвращает: <Immediate> ссылку на
immediate
При вызове активный объект Immediate не будет требовать, чтобы цикл событий Node.js оставался активным. Если нет другой активности, поддерживающей работу цикла событий, процесс может завершиться до вызова функции обратного вызова объекта Immediate. Повторный вызов immediate.unref() не оказывает эффекта.
immediate[Symbol.dispose]()
Отменяет немедленный вызов. Это аналог вызова clearImmediate().
Класс: Timeout
Этот объект создается внутри системы и возвращается из setTimeout() и setInterval(). Его можно передать в clearTimeout() или clearInterval(), чтобы отменить запланированные действия.
По умолчанию, когда таймер планируется с помощью setTimeout() или setInterval(), цикл событий Node.js продолжает работать, пока таймер активен. Каждый объект Timeout, возвращаемый этими функциями, экспортирует функции timeout.ref() и timeout.unref(), которые можно использовать для управления этим поведением по умолчанию.
timeout.close()
clearTimeout().- Возвращает: <Timeout> ссылку на
timeout
Отменяет тайм-аут.
timeout.hasRef()
- Возвращает: <boolean>
Если значение равно true, объект Timeout будет поддерживать активность цикла событий Node.js.
timeout.ref()
- Возвращает: <Timeout> ссылку на
timeout
При вызове запрашивает, чтобы цикл событий Node.js не завершался, пока активен объект Timeout. Повторный вызов timeout.ref() не оказывает эффекта.
По умолчанию все объекты Timeout являются «ref'ed», поэтому обычно вызывать timeout.ref() не требуется, если ранее не был вызван timeout.unref().
timeout.refresh()
- Возвращает: <Timeout> ссылку на
timeout
Устанавливает время начала таймера на текущий момент и перепланирует его так, чтобы функция обратного вызова была вызвана по истечении ранее заданного интервала, отсчитываемого от текущего момента. Это позволяет обновить таймер без выделения памяти под новый объект JavaScript.
При использовании для таймера, функция обратного вызова которого уже была вызвана, таймер снова активируется.
timeout.unref()
- Возвращает: <Timeout> ссылку на
timeout
При вызове активный объект Timeout не будет требовать, чтобы цикл событий Node.js оставался активным. Если нет другой активности, поддерживающей работу цикла событий, процесс может завершиться до вызова функции обратного вызова объекта Timeout. Повторный вызов timeout.unref() не оказывает эффекта.
timeout[Symbol.toPrimitive]()
- Возвращает: <integer> число, которое можно использовать для ссылки на этот объект
timeout
Преобразует объект Timeout в примитивное значение. Это значение можно использовать для очистки объекта Timeout. Примитивное значение можно использовать только в том же потоке, в котором был создан тайм-аут. Поэтому для использования в worker_threads его сначала необходимо передать в нужный поток. Это повышает совместимость с реализациями setTimeout() и setInterval() в браузерах.
Планирование таймеров
Таймер в Node.js — это внутренняя конструкция, которая вызывает заданную функцию по истечении определенного промежутка времени. Момент вызова функции таймера зависит от использованного метода создания таймера и от того, какую еще работу выполняет цикл событий Node.js.
setImmediate(callback[, ...args])
-
callback<Function> Функция, которую нужно вызвать в конце текущего прохода цикла событий Node.js -
...args<any> Необязательные аргументы, передаваемые при вызовеcallback. - Возвращает: <Immediate> для использования с
clearImmediate()
Планирует «немедленное» выполнение callback после вызова функций обратного вызова событий ввода-вывода.
Если вызвать setImmediate() несколько раз, функции callback будут поставлены в очередь на выполнение в порядке их создания. Очередь функций обратного вызова обрабатывается целиком на каждой итерации цикла событий. Если таймер немедленного вызова поставлен в очередь из выполняемой функции обратного вызова, он сработает только на следующей итерации цикла событий.
Если callback не является функцией, будет выброшена ошибка TypeError.
У этого метода есть специальный вариант для промисов, доступный через timersPromises.setImmediate().
setInterval(callback[, delay[, ...args]])
-
callback<Function> Функция, которую нужно вызвать по истечении таймера. -
delay<number> Количество миллисекунд ожидания перед вызовомcallback. По умолчанию:1. -
...args<any> Необязательные аргументы, передаваемые при вызовеcallback. - Возвращает: <Timeout> для использования с
clearInterval()
Планирует повторный вызов callback с интервалом delay миллисекунд.
Если значение delay больше 2147483647 или меньше 1, значение delay будет установлено в 1. Нецелые значения задержки усекаются до целого числа.
Если callback не является функцией, будет выброшена ошибка TypeError.
У этого метода есть специальный вариант для промисов, доступный через timersPromises.setInterval().
setTimeout(callback[, delay[, ...args]])
-
callback<Function> Функция, которую нужно вызвать по истечении таймера. -
delay<number> Количество миллисекунд ожидания перед вызовомcallback. По умолчанию:1. -
...args<any> Необязательные аргументы, передаваемые при вызовеcallback. - Возвращает: <Timeout> для использования с
clearTimeout()
Планирует однократный вызов callback через delay миллисекунд.
Вероятнее всего, вызов callback произойдет не ровно через delay миллисекунд. Node.js не гарантирует точное время вызова функций обратного вызова и порядок их вызова. Функция обратного вызова будет вызвана как можно ближе к указанному времени.
Если значение delay больше 2147483647 или меньше 1, значение delay будет установлено в 1. Нецелые значения задержки усекаются до целого числа.
Если callback не является функцией, будет выброшена ошибка TypeError.
У этого метода есть специальный вариант для промисов, доступный через timersPromises.setTimeout().
Отмена таймеров
Каждый из методов setImmediate(), setInterval() и setTimeout() возвращает объект, представляющий запланированный таймер. Эти объекты можно использовать для отмены таймера и предотвращения его срабатывания.
Для вариантов методов setImmediate() и setTimeout(), возвращающих промисы, для отмены таймера можно использовать AbortController. После отмены возвращенные промисы будут отклонены с ошибкой 'AbortError'.
Для setImmediate():
Модули JavaScript
import { setImmediate as setImmediatePromise } from 'node:timers/promises';
const ac = new AbortController();
const signal = ac.signal;
// We do not `await` the promise so `ac.abort()` is called concurrently.
setImmediatePromise('foobar', { signal })
.then(console.log)
.catch((err) => {
if (err.name === 'AbortError')
console.error('The immediate was aborted');
});
ac.abort();CommonJS
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():
Модули JavaScript
import { setTimeout as setTimeoutPromise } from 'node:timers/promises';
const ac = new AbortController();
const signal = ac.signal;
// We do not `await` the promise so `ac.abort()` is called concurrently.
setTimeoutPromise(1000, 'foobar', { signal })
.then(console.log)
.catch((err) => {
if (err.name === 'AbortError')
console.error('The timeout was aborted');
});
ac.abort();CommonJS
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)
-
immediate<Immediate> ОбъектImmediate, возвращаемый изsetImmediate().
Отменяет объект Immediate, созданный методом setImmediate().
clearInterval(timeout)
-
timeout<Timeout> | <string> | <number> ОбъектTimeout, возвращаемый методомsetInterval(), либо примитивное значение объектаTimeoutв виде строки или числа.
Отменяет объект Timeout, созданный методом setInterval().
clearTimeout(timeout)
-
timeout<Timeout> | <string> | <number> ОбъектTimeout, возвращаемый методомsetTimeout(), либо примитивное значение объектаTimeoutв виде строки или числа.
Отменяет объект Timeout, созданный методом setTimeout().
API промисов таймеров
API timers/promises предоставляет альтернативный набор функций таймеров, возвращающих объекты Promise. Доступ к API осуществляется через require('node:timers/promises').
Модули JavaScript
import {
setTimeout,
setImmediate,
setInterval,
} from 'node:timers/promises';CommonJS
const {
setTimeout,
setImmediate,
setInterval,
} = require('node:timers/promises');
timersPromises.setTimeout([delay[, value[, options]]])
-
delay<number> Количество миллисекунд ожидания перед выполнением промиса. По умолчанию:1. -
value<any> Значение, с которым выполняется промис. -
options<Object>-
ref<boolean> Установите значениеfalse, чтобы указать, что запланированный объектTimeoutне должен требовать, чтобы цикл событий Node.js оставался активным. По умолчанию:true. -
signal<AbortSignal> Необязательный объектAbortSignal, который можно использовать для отмены запланированного объектаTimeout.
-
Модули JavaScript
import {
setTimeout,
} from 'node:timers/promises';
const res = await setTimeout(100, 'result');
console.log(res); // Prints 'result'CommonJS
const {
setTimeout,
} = require('node:timers/promises');
setTimeout(100, 'result').then((res) => {
console.log(res); // Prints 'result'
});
timersPromises.setImmediate([value[, options]])
-
value<any> Значение, с которым выполняется промис. -
options<Object>-
ref<boolean> Установите значениеfalse, чтобы указать, что запланированный объектImmediateне должен требовать, чтобы цикл событий Node.js оставался активным. По умолчанию:true. -
signal<AbortSignal> Необязательный объектAbortSignal, который можно использовать для отмены запланированного объектаImmediate.
-
Модули JavaScript
import {
setImmediate,
} from 'node:timers/promises';
const res = await setImmediate('result');
console.log(res); // Prints 'result'CommonJS
const {
setImmediate,
} = require('node:timers/promises');
setImmediate('result').then((res) => {
console.log(res); // Prints 'result'
});
timersPromises.setInterval([delay[, value[, options]]])
Возвращает асинхронный итератор, генерирующий значения с интервалом delay мс. Если ref имеет значение true, необходимо явно или неявно вызвать next() асинхронного итератора, чтобы цикл событий оставался активным.
-
delay<number> Количество миллисекунд ожидания между итерациями. По умолчанию:1. -
value<any> Значение, возвращаемое итератором. -
options<Object>-
ref<boolean> Установите значениеfalse, чтобы указать, что запланированный объектTimeoutмежду итерациями не должен требовать, чтобы цикл событий Node.js оставался активным. По умолчанию:true. -
signal<AbortSignal> Необязательный объектAbortSignal, который можно использовать для отмены запланированного объектаTimeoutмежду операциями.
-
Модули JavaScript
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());CommonJS
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])
-
delay<number> Количество миллисекунд ожидания перед выполнением промиса. -
options<Object>-
ref<boolean> Установите значениеfalse, чтобы указать, что запланированный объектTimeoutне должен требовать, чтобы цикл событий Node.js оставался активным. По умолчанию:true. -
signal<AbortSignal> Необязательный объектAbortSignal, который можно использовать для отмены ожидания.
-
- Возвращает: <Promise>
Экспериментальный API, определенный в проекте спецификации Scheduling APIs, разрабатываемом в качестве стандартного API веб-платформы.
Вызов timersPromises.scheduler.wait(delay, options) эквивалентен вызову timersPromises.setTimeout(delay, undefined, options).
import { scheduler } from 'node:timers/promises';
await scheduler.wait(1000); // Wait one second before continuing copy
timersPromises.scheduler.yield()
- Возвращает: <Promise>
Экспериментальный API, определенный в проекте спецификации Scheduling APIs, разрабатываемом в качестве стандартного API веб-платформы.
Вызов timersPromises.scheduler.yield() эквивалентен вызову timersPromises.setImmediate() без аргументов.
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v22.x/docs/api/timers.html