概要

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していきます。