Skip to content

process.nextTick()の理解

Node.jsのイベントループを理解する上で重要な要素の一つにprocess.nextTick()があります。イベントループが一回完全に動作する毎に、それを1ティックと呼びます。

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

js
process.nextTick(() => {
  // 何らかの処理を行う
})

イベントループは現在の関数コードを処理中です。この処理が終了すると、JSエンジンはその処理中にnextTick呼び出しに渡された全ての関数を走らせます。

これは、関数を非同期的に(現在の関数後に)しかし可能な限り早く処理するようにJSエンジンに指示する方法であり、キューイングは行いません。

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

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

イベントの順序の例:

js
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')
})

実行結果例:

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

実行結果が実行ごとに異なる場合があります。