質問: ``` process.nextTick(() => { Promise.resolve().then(() => console.log('PROMISE1')) console.log('next tick1') process.nextTick(() => { Promise.resolve().then(() => console.log('PROMISE2')) console.log('next tick2') process.nextTick(() => { Promise.resolve().then(() => console.log('PROMISE3 ')) console.log('next tick3') }) }) }) // 実行 /* * next tick1 * next tick2 * next tick3 * PROMISE1 * PROMISE2 * PROMISE3 */ ``` `process.nextTick`で渡したコールバック関数は次のイベントループの最初に実行されると理解していますが、上の実行結果を見ると少し違うですかね?上のコードでは`process.nextTick`はどのように動いてますか? 試しに`process.nextTick`を`setImmediate`にしたら思い通りに交互に実行されました。 曖昧な質問ですみません。よろしくお願いします。
回答: > > process.nextTickで渡したコールバック関数は次のイベントループの最初に実行されると理解していますが > > > 厳密には`nextTick`はイベントループで走らず、 その手前の段階で動作するようです。 したがってPromiseを多数宣言しても1個たりとも動作せず、質問文のように全てのnextTickが先に処理されます。 この辺が詳しく載っています。 内部実装から読み解くNode.js(v11.0.0) Eventloop - Qiita > > process.nextTick/Promiseのタイミング > ------------------------------- > > > - process.nextTickはEventloop内ではなくユーザーランドの実行後 > > - PromiseはJSレイヤーなので、Eventloop内ではなくユーザーランドの実行後 > > どちらが先? > > - PromiseはObject.observe()と同じ発火タイミングで、process.nextTick()の方が先になる > > > という訳でProcess.nextTickの方が優先順位が高くなります。 普段使いにはどちらが良いのか?という疑問が出ると思いますが、setImmediateをメインで使うと良いみたいですね。 setImmediate()とnextTick()なにが違うの - Qiita > > 要は、I/O処理より先に呼ばれるのがnextTickで後に呼ばれるのがsetImmediate。 > > eventloopの効率利用を考えると先にI/0処理したいので、setImmediate()を選択しとけば間違いなさそう。 > > >