概要
Node.jsのイベントループの仕組みについてNode.jsでのイベントループの仕組みとタイマーについてという記事で学びました。しかし、こちらに掲載されている例だけではイベントキューの仕組みがピンとこなかったので自分なりに実験してみました。
イベントキューの動作を見る
Node.jsでのイベントループの仕組みとタイマーについてでは以下のコードが掲載されています。
setTimeout(() => console.log(1));
setImmediate(() => console.log(2));
process.nextTick(() => console.log(3));
Promise.resolve().then(() => console.log(4));
(() => console.log(5))();
出力は以下のようになります。
5
3
4
1
2
こうなる理由についてはhiroppyさんのブログの解説にまかせるとして、それぞれの命令がそれぞれのフェーズのキューに積まれる部分を理解したいなと思いました。
少し最初のコードを改造して以下のようにします。
setTimeout(() => console.log('1-1'));
setImmediate(() => console.log('1-2'));
process.nextTick(() => console.log('1-3'));
Promise.resolve().then(() => console.log('1-4'));
(() => console.log('1-5'))();
setTimeout(() => console.log('2-1'));
setImmediate(() => console.log('2-2'));
process.nextTick(() => console.log('2-3'));
Promise.resolve().then(() => console.log('2-4'));
(() => console.log('2-5'))();
実行結果は以下のようになります。
1-5
2-5
1-3
2-3
1-4
2-4
1-1
2-1
1-2
2-2
この動作から各命令は各フェーズのキューに積まれて積まれた準に実行されていることがわかります。操作の順番は5->3->4->1->2の順番をキープしつつ。キューの積まれた順番(1or2)は1->2をキープしています。setTimeoutについてはあくまでタイマーがスタートする順番が1->2なので引数を変えたりすると標準出力のタイミングがずれます。
もう少しわかり易い例を思いつきましたらupdateしていきます。