タイマー#

安定性: 2 - Stable

ソースコード: lib/timers.js

timer モジュールは、将来のある時点で呼び出される関数をスケジュールするためのグローバル API を公開します。タイマー関数はグローバルであるため、API を使用するために require('node:timers') を呼び出す必要はありません。

Node.js 内のタイマー関数は、Web ブラウザが提供するタイマー API と同様の API を実装していますが、Node.js のイベントループを中心に構築された異なる内部実装を使用しています。

クラス: Immediate#

このオブジェクトは内部で作成され、setImmediate() から返されます。スケジュールされたアクションをキャンセルするために clearImmediate() に渡すことができます。

デフォルトでは、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.unref() が呼び出されていない限り、通常は immediate.ref() を呼び出す必要はありません。

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.unref() が呼び出されていない限り、通常は timeout.ref() を呼び出す必要はありません。

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 関数は作成された順序で実行キューに入れられます。コールバックキュー全体は、イベントループの各イテレーションで処理されます。実行中のコールバック内から即時タイマーがキューに入れられた場合、そのタイマーは次のイベントループのイテレーションまでトリガーされません。

callback が関数でない場合、TypeError がスローされます。

このメソッドには、timersPromises.setImmediate() を使用して利用できるプロミス用のカスタムバリアントがあります。

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

  • callback <Function> タイマーが経過したときに呼び出す関数。
  • delay <number> callback を呼び出す前に待機するミリ秒数。デフォルト: 1
  • ...args <any> callback が呼び出されるときに渡すオプションの引数。
  • 戻り値: <Timeout> clearInterval() で使用するため

delay ミリ秒ごとに callback の繰り返し実行をスケジュールします。

delay2147483647 より大きいか 1 未満、または NaN の場合、delay1 に設定されます。整数でない遅延は整数に切り捨てられます。

callback が関数でない場合、TypeError がスローされます。

このメソッドには、timersPromises.setInterval() を使用して利用できるプロミス用のカスタムバリアントがあります。

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

  • callback <Function> タイマーが経過したときに呼び出す関数。
  • delay <number> callback を呼び出す前に待機するミリ秒数。デフォルト: 1
  • ...args <any> callback が呼び出されるときに渡すオプションの引数。
  • 戻り値: <Timeout> clearTimeout() で使用するため

delay ミリ秒後に 1 回限りの callback の実行をスケジュールします。

callback は、正確に delay ミリ秒で呼び出されるとは限りません。Node.js は、コールバックがいつ発生するかの正確なタイミングやその順序について保証しません。コールバックは、指定された時間にできるだけ近いタイミングで呼び出されます。

delay2147483647 より大きいか 1 未満、または NaN の場合、delay1 に設定されます。整数でない遅延は整数に切り捨てられます。

callback が関数でない場合、TypeError がスローされます。

このメソッドには、timersPromises.setTimeout() を使用して利用できるプロミス用のカスタムバリアントがあります。

タイマーのキャンセル#

setImmediate()setInterval()、および setTimeout() メソッドは、それぞれスケジュールされたタイマーを表すオブジェクトを返します。これらは、タイマーをキャンセルしてトリガーされるのを防ぐために使用できます。

setImmediate()setTimeout() のプロミス化されたバリアントでは、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 オブジェクトをキャンセルします。

Timers 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> プロミスを履行する前に待機するミリ秒数。デフォルト: 1
  • value <any> プロミスが履行されるときの値。
  • options <Object>
    • ref <boolean> false に設定すると、スケジュールされた Timeout が Node.js のイベントループをアクティブに保つ必要がないことを示します。デフォルト: true
    • signal <AbortSignal> スケジュールされた Timeout をキャンセルするために使用できるオプションの AbortSignal
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> プロミスが履行されるときの値。
  • options <Object>
    • ref <boolean> false に設定すると、スケジュールされた Immediate が Node.js のイベントループをアクティブに保つ必要がないことを示します。デフォルト: true
    • signal <AbortSignal> スケジュールされた Immediate をキャンセルするために使用できるオプションの AbortSignal
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> 操作間のスケジュールされた Timeout をキャンセルするために使用できるオプションの AbortSignal
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 - Experimental

  • delay <number> プロミスを解決する前に待機するミリ秒数。
  • options <Object>
    • ref <boolean> false に設定すると、スケジュールされた Timeout が Node.js のイベントループをアクティブに保つ必要がないことを示します。デフォルト: true
    • signal <AbortSignal> 待機をキャンセルするために使用できるオプションの AbortSignal
  • 戻り値: <Promise>

標準の Web プラットフォーム 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 

timersPromises.scheduler.yield()#

安定性: 1 - Experimental

標準の Web プラットフォーム API として開発されている Scheduling APIs ドラフト仕様によって定義された実験的な API です。

timersPromises.scheduler.yield() を呼び出すことは、引数なしで timersPromises.setImmediate() を呼び出すことと等価です。