Node.js v25.0.0 文档
- Node.js v25.0.0
- 目录
-
索引
- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲区
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入器 API
- 子进程
- 集群
- 命令行选项
- 控制台
- 加密
- 调试器
- 已弃用的 API
- 诊断通道
- DNS
- 域
- 环境变量
- 错误
- 事件
- 文件系统
- 全局对象
- HTTP
- HTTP/2
- HTTPS
- 检查器
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:module
API - 模块:包
- 模块:TypeScript
- 网络
- 操作系统
- 路径
- 性能钩子
- 权限
- 进程
- Punycode
- 查询字符串
- 逐行读取
- REPL
- 报告
- 单一可执行文件应用
- SQLite
- 流
- 字符串解码器
- 测试运行器
- 定时器
- TLS/SSL
- 跟踪事件
- TTY
- UDP/数据报
- URL
- 实用工具
- V8
- 虚拟机
- WASI
- Web Crypto API
- Web Streams API
- 工作线程
- Zlib
- 其他版本
- 选项
定时器#
源代码: lib/timers.js
timer
模块暴露了一个全局 API,用于调度函数在未来的某个时间段内被调用。因为定时器函数是全局的,所以使用该 API 无需调用 require('node:timers')
。
Node.js 中的定时器函数实现了与 Web 浏览器提供的定时器 API 类似的 API,但使用了不同的内部实现,该实现是围绕 Node.js 事件循环构建的。
类: Immediate
#
该对象在内部创建,并由 setImmediate()
返回。它可以被传递给 clearImmediate()
以取消已调度的操作。
默认情况下,当一个 immediate 被调度时,只要该 immediate 处于活动状态,Node.js 事件循环就会继续运行。setImmediate()
返回的 Immediate
对象导出了 immediate.ref()
和 immediate.unref()
函数,可用于控制此默认行为。
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.ref()
#
- 返回: <Timeout> 对
timeout
的引用
当被调用时,只要 Timeout
处于活动状态,就请求 Node.js 事件循环不要退出。多次调用 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
函数会按照它们被创建的顺序排队等待执行。整个回调队列在每次事件循环迭代中都会被处理。如果在一个正在执行的回调函数内部排队了一个 immediate 定时器,该定时器直到下一次事件循环迭代时才会被触发。
如果 callback
不是一个函数,将会抛出 TypeError
。
此方法有一个针对 promises 的自定义变体,可通过 timersPromises.setImmediate()
使用。
setInterval(callback[, delay[, ...args]])
#
callback
<Function> 定时器到期时要调用的函数。delay
<number> 调用callback
之前要等待的毫秒数。默认值:1
。...args
<any> 调用callback
时要传递的可选参数。- 返回: <Timeout> 用于
clearInterval()
调度每隔 delay
毫秒重复执行 callback
。
当 delay
大于 2147483647
或小于 1
或为 NaN
时,delay
将被设置为 1
。非整数的延迟将被截断为整数。
如果 callback
不是一个函数,将会抛出 TypeError
。
此方法有一个针对 promises 的自定义变体,可通过 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
或为 NaN
时,delay
将被设置为 1
。非整数的延迟将被截断为整数。
如果 callback
不是一个函数,将会抛出 TypeError
。
此方法有一个针对 promises 的自定义变体,可通过 timersPromises.setTimeout()
使用。
取消定时器#
setImmediate()
、setInterval()
和 setTimeout()
方法各自返回代表已调度定时器的对象。这些对象可以用来取消定时器并阻止其触发。
对于 setImmediate()
和 setTimeout()
的 promisified 变体,可以使用 AbortController
来取消定时器。当取消时,返回的 Promises 将以 'AbortError'
被拒绝。
对于 setImmediate()
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();
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()
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();
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
对象。
定时器 Promises API#
timers/promises
API 提供了一组替代的定时器函数,它们返回 Promise
对象。该 API 可通过 require('node:timers/promises')
访问。
import {
setTimeout,
setImmediate,
setInterval,
} from 'node: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 'node: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 'node: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 '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());
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>ref
<boolean> 设置为false
表示已调度的Timeout
不应要求 Node.js 事件循环保持活动状态。默认值:true
。signal
<AbortSignal> 一个可选的AbortSignal
,可用于取消等待。
- 返回:<Promise>
一个由 调度 API 草案规范定义的实验性 API,该规范正在作为标准的 Web 平台 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