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
実行結果が実行ごとに異なる場合があります。