计时器#

稳定性:2 - 稳定

源代码: lib/timers.js

timer 模块公开了一个全局 API,用于安排在未来某个时间点调用函数。由于计时器函数是全局的,因此无需调用 require('node:timers') 即可使用该 API。

Node.js 中的计时器函数实现了一个与 Web 浏览器提供的计时器 API 类似的 API,但使用了围绕 Node.js 事件循环 构建的不同内部实现。

类:Immediate#

此对象在内部创建,并从 setImmediate() 返回。可以将其传递给 clearImmediate() 以取消计划的操作。

默认情况下,当安排立即执行时,只要立即执行处于活动状态,Node.js 事件循环就会继续运行。由 setImmediate() 返回的 Immediate 对象导出了 immediate.ref()immediate.unref() 函数,可用于控制此默认行为。

immediate.hasRef()#

如果为 true,则 Immediate 对象将保持 Node.js 事件循环处于活动状态。

immediate.ref()#

调用时,请求只要 Immediate 处于活动状态,Node.js 事件循环就退出。多次调用 immediate.ref() 不会产生任何效果。

默认情况下,所有 Immediate 对象都是“ref'ed”,因此通常不需要调用 immediate.ref(),除非之前已调用 immediate.unref()

immediate.unref()#

调用时,活动的 Immediate 对象不需要 Node.js 事件循环保持活动状态。如果没有其他活动使事件循环继续运行,则进程可能会在调用 Immediate 对象的回调之前退出。多次调用 immediate.unref() 不会产生任何效果。

immediate[Symbol.dispose]()#

稳定性:1 - 实验性

取消 immediate。这类似于调用 clearImmediate()

类:Timeout#

此对象在内部创建,并从 setTimeout()setInterval() 返回。它可以传递给 clearTimeout()clearInterval() 以取消预定的操作。

默认情况下,当使用 setTimeout()setInterval() 调度计时器时,只要计时器处于活动状态,Node.js 事件循环就会继续运行。这些函数返回的每个 Timeout 对象都导出 timeout.ref()timeout.unref() 函数,可用于控制此默认行为。

timeout.close()#

稳定性:3 - 遗留:改为使用 clearTimeout()

取消超时。

timeout.hasRef()#

如果为 true,则 Timeout 对象将使 Node.js 事件循环保持活动状态。

timeout.ref()#

调用时,请求 Node.js 事件循环在 Timeout 处于活动状态时退出。多次调用 timeout.ref() 不会产生任何效果。

默认情况下,所有 Timeout 对象都是“ref'ed”,因此通常不需要调用 timeout.ref(),除非之前已调用 timeout.unref()

timeout.refresh()#

将计时器的开始时间设置为当前时间,并重新安排计时器在调整到当前时间的先前指定持续时间调用其回调。这对于在不分配新的 JavaScript 对象的情况下刷新计时器很有用。

在已调用其回调的计时器上使用此功能将重新激活计时器。

timeout.unref()#

调用时,活动 Timeout 对象将不需要 Node.js 事件循环保持活动状态。如果没有其他活动使事件循环继续运行,则进程可能会在调用 Timeout 对象的回调之前退出。多次调用 timeout.unref() 不会产生任何效果。

timeout[Symbol.toPrimitive]()#

  • 返回:<integer> 可用于引用此 timeout 的数字

Timeout 强制转换为基元。基元可用于清除 Timeout。基元只能在创建超时的时间内使用。因此,要在 worker_threads 中使用它,必须先将其传递给正确的线程。这增强了与浏览器 setTimeout()setInterval() 实现的兼容性。

timeout[Symbol.dispose]()#

稳定性:1 - 实验性

取消超时。

调度计时器#

Node.js 中的计时器是一个内部构造,它在一定时间后调用给定的函数。调用计时器函数的时间取决于用于创建计时器的方法以及 Node.js 事件循环正在执行的其他工作。

setImmediate(callback[, ...args])#

在 I/O 事件的回调之后调度 callback 的“立即”执行。

当对 setImmediate() 进行多次调用时,callback 函数将按创建它们的顺序排队执行。每次事件循环迭代都会处理整个回调队列。如果从正在执行的回调中排队了立即计时器,则该计时器将等到下一个事件循环迭代才会触发。

如果 callback 不是函数,则会抛出 TypeError

此方法有一个自定义的变体,可使用 timersPromises.setImmediate() 获得。

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

  • callback <Function> 计时器经过时要调用的函数。
  • delay <number> 在调用 callback 之前要等待的毫秒数。默认值:1
  • ...args <any> 调用 callback 时要传递的可选参数。
  • 返回:<Timeout>,可与 clearInterval() 一起使用

计划每隔 delay 毫秒重复执行 callback

delay 大于 2147483647 或小于 1 时,delay 将设置为 1。非整数延迟将被截断为整数。

如果 callback 不是函数,则会抛出 TypeError

此方法有一个自定义的变体,可使用 timersPromises.setInterval() 获得。

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

  • callback <Function> 计时器经过时要调用的函数。
  • delay <number> 在调用 callback 之前要等待的毫秒数。默认值:1
  • ...args <any> 调用 callback 时要传递的可选参数。
  • 返回:<Timeout>,可与 clearTimeout() 一起使用

计划在 delay 毫秒后执行一次性 callback

callback 可能不会在精确的 delay 毫秒内调用。Node.js 无法保证回调何时触发,也无法保证其顺序。回调将在尽可能接近指定时间的时候调用。

delay 大于 2147483647 或小于 1 时,delay 将设置为 1。非整数延迟将被截断为整数。

如果 callback 不是函数,则会抛出 TypeError

此方法有一个自定义的变体,可使用 timersPromises.setTimeout() 获得。

取消计时器#

setImmediate()setInterval()setTimeout() 方法各自返回表示已计划计时器的对象。这些对象可用于取消计时器并阻止其触发。

对于 setImmediate()setTimeout() 的 Promise 变体,可以使用 AbortController 取消计时器。取消后,返回的 Promise 将因 'AbortError' 而被拒绝。

对于 setImmediate()

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()

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)#

取消由 setImmediate() 创建的 Immediate 对象。

clearInterval(timeout)#

取消由 setInterval() 创建的 Timeout 对象。

clearTimeout(timeout)#

取消由 setTimeout() 创建的 Timeout 对象。

Timers Promises API#

timers/promises API 提供了一组替代计时器函数,这些函数返回 Promise 对象。可以通过 require('node:timers/promises') 访问该 API。

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

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

  • delay <number> 在兑现 Promise 之前等待的毫秒数。默认值:1
  • value <any> 用来兑现 Promise 的值。
  • options <Object>
    • ref <boolean> 设置为 false 以指示计划的 Timeout 不应要求 Node.js 事件循环保持活动状态。默认值:true
    • signal <AbortSignal> 可选的 AbortSignal,可用于取消计划的 Timeout
import {
  setTimeout,
} from 'timers/promises';

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

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

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

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

  • value <any> 用来兑现 Promise 的值。
  • options <Object>
    • ref <boolean> 设置为 false 以指示计划的 Immediate 不应要求 Node.js 事件循环保持活动状态。默认值:true
    • signal <AbortSignal> 可选的 AbortSignal,可用于取消计划的 Immediate
import {
  setImmediate,
} from 'timers/promises';

const res = await setImmediate('result');

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

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

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

返回一个异步迭代器,以 delay 毫秒的间隔生成值。如果 reftrue,则需要显式或隐式调用异步迭代器的 next() 以保持事件循环处于活动状态。

  • delay <number> 迭代之间等待的毫秒数。默认值:1
  • value <any> 迭代器返回的值。
  • options <Object>
    • ref <boolean> 设置为 false 以指示迭代之间的计划 Timeout 不应要求 Node.js 事件循环保持活动状态。默认值:true
    • signal <AbortSignal> 可选的 AbortSignal,可用于取消操作之间的计划 Timeout
import {
  setInterval,
} from '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());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])#

稳定性:1 - 实验性

Scheduling APIs 草案规范定义的实验性 API,该规范正在开发为标准 Web 平台 API。

调用 timersPromises.scheduler.wait(delay, options) 大致等同于调用 timersPromises.setTimeout(delay, undefined, options),但 ref 选项不受支持。

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

await scheduler.wait(1000); // Wait one second before continuing 

timersPromises.scheduler.yield()#

稳定性:1 - 实验性

Scheduling APIs 草案规范定义的实验性 API,该规范正在开发为标准 Web 平台 API。

调用 timersPromises.scheduler.yield() 等同于调用 timersPromises.setImmediate(),且不带任何参数。