process.nextTick()を理解する

Node.jsのイベントループを理解しようとすると、その重要な部分の1つがprocess.nextTick()です。イベントループが一周するたびに、それを「ティック」と呼びます。

process.nextTick()に関数を渡すと、エンジンは次のイベントループのティックが開始される前に、現在の操作の最後にこの関数を呼び出すように指示します。

process.nextTick(() => {
  // do something
});

イベントループは現在の関数コードの処理でビジー状態です。 この操作が終了すると、JSエンジンはその操作中に`nextTick`呼び出しに渡されたすべての関数を実行します。

これは、JSエンジンに現在の関数の後で非同期的に関数を処理するように指示する方法ですが、キューに入れずにできるだけ早く処理します。

setTimeout(() => {}, 0)を呼び出すと、関数は次のティックの最後に実行されます。これは、呼び出しを優先し、次のティックの開始直前に実行するnextTick()を使用する場合よりもはるかに遅くなります。

次のイベントループの反復でコードが既に実行されていることを確認したい場合は、nextTick()を使用します。

イベントの順序の例

console.log('Hello => number 1');

setImmediate(() => {
  console.log('Running before the timeout => number 3');
});

setTimeout(() => {
  console.log('The timeout running last => number 4');
}, 0);

process.nextTick(() => {
  console.log('Running at next tick => number 2');
});

出力例

Hello => number 1
Running at next tick => number 2
Running before the timeout => number 3
The timeout running last => number 4

正確な出力は実行ごとに異なる場合があります。