process.nextTick()
を理解する
Node.js のイベントループを理解しようとする際に、重要な部分の一つが process.nextTick()
です。イベントループが一周するたびに、それをティックと呼びます。
関数を process.nextTick() に渡すと、現在の操作の終了時、かつ次のイベントループティックが開始する前に、この関数を呼び出すようにエンジンに指示します。
js
process.nextTick(() => {
// 何かをする
})
イベントループは現在の関数コードの処理でビジー状態です。この操作が終了すると、JS エンジンはその操作中に nextTick
呼び出しに渡されたすべての関数を実行します。
これは、JS エンジンに非同期的に(現在の関数の後で)関数を処理するように指示するものの、キューに入れずに可能な限り早く処理する方法です。
setTimeout(() => {}, 0)
を呼び出すと、次のティックの最後に実行されますが、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
正確な出力は、実行ごとに異なる場合があります。