Node.js 當 main thread 執行結束後會進入 event queue 迴圈中。每次 event queue 迴圈中有下面 6 個階段,每個階段會執行它相應的 queue 內的 task,當它的 queue 內的 task 執行完畢後會執行完所有 porcess.nextTick()
放入 nextTickQueue
中的 task,接著再執行完 Promise
放入 micro task queue 中的 task,並且會等到 nextTickQueue 和 micro task queue 全部執行完畢後才會進入下個階段。
所以如果 Promise
resolve 中會產生新的 Promise
或 process.nextTick
會呼叫新的 process.nextTick
則 micro task queue 階段就會一直執行下去而卡住 event queue 讓程式無法回應 request。
比方:
會印出 1221
,它的執行狀況是:
f()
f()
內的 process.nextTick(() => console.log(1));
將 console.log(1)
放入 nextTickQueue 中f()
內的 Promise.resolve().then(() => console.log(2));
將 console.log(2)
放入 micro task queue 中Promise.resolve().then(f);
將 f()
放入 micro task queue 中1
,之後 nextTickQueue 沒有 task2
f()
f()
內的 process.nextTick(() => console.log(1));
將 console.log(1)
放入 nextTickQueue 中f()
內的 Promise.resolve().then(() => console.log(2));
將 console.log(2)
放入 micro task queue 中console.log(2)
印出 2
,結束後 micro task queue 沒有 taskconsole.log(1)
印出 1
,結束後 nextTickQueue 沒有 tasktimer
pending
idle, prepare
poll
check
closed