定時器#

穩定性:2 - 穩定

原始碼: 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.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]()#

取消 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()#

當被呼叫時,只要 Timeout 處於活動狀態,就請求 Node.js 事件迴圈不要退出。多次呼叫 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]()#

取消超時。

排程定時器#

Node.js 中的定時器是一個內部結構,它在一定時間後呼叫給定的函式。定時器函式的呼叫時機取決於建立定時器所使用的方法以及 Node.js 事件迴圈正在執行的其他工作。

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

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

取消由 setImmediate() 建立的 Immediate 物件。

clearInterval(timeout)#

取消由 setInterval() 建立的 Timeout 物件。

clearTimeout(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 毫秒的間隔生成值。如果 reftrue,你需要顯式或隱式地呼叫非同步迭代器的 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])#

穩定性:1 - 實驗性

  • 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 

timersPromises.scheduler.yield()#

穩定性:1 - 實驗性

一個由 排程 API 草案規範定義的實驗性 API,該規範正在作為標準的 Web 平臺 API 進行開發。

呼叫 timersPromises.scheduler.yield() 等同於不帶引數呼叫 timersPromises.setImmediate()