Node.js v21.7.2 文档
- Node.js v21.7.2
- ► 目录
-
► 索引
- 断言测试
- 异步上下文跟踪
- Async 钩子
- 缓冲区
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入器 API
- 子进程
- 集群
- 命令行选项
- 控制台
- Corepack
- 加密
- 调试器
- 已弃用的 API
- 诊断通道
- DNS
- 域
- 错误
- 事件
- 文件系统
- 全局变量
- HTTP
- HTTP/2
- HTTPS
- 检查器
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:module
API - 模块:包
- 网络
- 操作系统
- 路径
- 性能钩子
- 权限
- 进程
- Punycode
- 查询字符串
- 读取行
- REPL
- 报告
- 单个可执行应用程序
- 流
- 字符串解码器
- 测试运行器
- 计时器
- TLS/SSL
- 跟踪事件
- TTY
- UDP/数据报
- URL
- 实用工具
- V8
- VM
- WASI
- Web Crypto API
- Web Streams API
- 工作线程
- Zlib
- ► 其他版本
- ► 选项
计时器#
源代码: 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()
#
- 返回:<boolean>
如果为 true,则 Immediate
对象将保持 Node.js 事件循环处于活动状态。
immediate.ref()
#
- 返回:<Immediate> 对
immediate
的引用
调用时,请求只要 Immediate
处于活动状态,Node.js 事件循环就不退出。多次调用 immediate.ref()
不会产生任何效果。
默认情况下,所有 Immediate
对象都是“ref'ed”,因此通常不需要调用 immediate.ref()
,除非之前已调用 immediate.unref()
。
immediate.unref()
#
- 返回:<Immediate> 对
immediate
的引用
调用时,活动的 Immediate
对象不需要 Node.js 事件循环保持活动状态。如果没有其他活动使事件循环继续运行,则进程可能会在调用 Immediate
对象的回调之前退出。多次调用 immediate.unref()
不会产生任何效果。
immediate[Symbol.dispose]()
#
取消 immediate。这类似于调用 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()
实现的兼容性。
timeout[Symbol.dispose]()
#
取消超时。
调度计时器#
Node.js 中的计时器是一个内部构造,它在一定时间后调用给定的函数。调用计时器函数的时间取决于用于创建计时器的方法以及 Node.js 事件循环正在执行的其他工作。
setImmediate(callback[, ...args])
#
callback
<Function> Node.js 事件循环 此轮结束时要调用的函数...args
<any> 调用callback
时要传递的可选参数。- 返回:<Immediate> 用于
clearImmediate()
在 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)
#
immediate
<Immediate> 由setImmediate()
返回的Immediate
对象。
取消由 setImmediate()
创建的 Immediate
对象。
clearInterval(timeout)
#
timeout
<Timeout> | <string> | <number> 由setInterval()
返回的Timeout
对象,或Timeout
对象的 基本类型,表示为字符串或数字。
取消由 setInterval()
创建的 Timeout
对象。
clearTimeout(timeout)
#
timeout
<Timeout> | <string> | <number> 由setTimeout()
返回的Timeout
对象,或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
毫秒的间隔生成值。如果 ref
为 true
,则需要显式或隐式调用异步迭代器的 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])
#
delay
<number> 在解析 Promise 之前等待的毫秒数。options
<Object>signal
<AbortSignal> 可选的AbortSignal
,可用于取消等待。
- 返回: <Promise>
由 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()
#
- 返回: <Promise>
由 Scheduling APIs 草案规范定义的实验性 API,该规范正在开发为标准 Web 平台 API。
调用 timersPromises.scheduler.yield()
等同于调用 timersPromises.setImmediate()
,且不带任何参数。