「for やめろ」またはイベントループと nextTick() - Block Rockin’ Codes
Node.jsはイベントのキューにイベントがあったら処理をする。
そしてイベントのキューにタスクがあるかどうかの確認でループし続けている(=ノンブロッキング)
イベントのキューにはIO用、setTimeout/setInterval用、setImmediate用、などの種類がある。この円の上にあるキューはlibuvで実装されていて、真ん中はnode.jsのもの。
Timers, Immediates and Process.nextTick— NodeJS Event Loop Part 2
流れとしては、キューを移動する前にnext tickキューを確認し、それが空になるまで処理し、空になったら移動する。タスク数の制限がないので注意が必要。
つまり、
開始
→next tick
→timers
→next tick
→IO
→next tick
→immediates
→next tick
→close handle
のように、毎回next tickをはさんで遷移する。
next tickにはタスク数の制限がないので、このコードは絶対に最後に「!」が出力される。こういった処理によってイベントループが回らなくなってしまう。
for (let i = 0; i < 10000; i++) {
process.nextTick( () => console.log('_'));
}
setImmediate( () => console.log('!'));