在官方檔案“setImmediate() vs setTimeout()”部分中,它說:“setImmediate() 旨在在當前輪詢階段完成后執行腳本”,據我了解,這也意味著當前的滴答/事件回圈回圈。
然而稍后在“process.nextTick() vs setImmediate()”部分,它說:“setImmediate()在事件回圈的下一次迭代或'tick'上觸發”。
那么哪一個是正確答案,我在這里錯過了什么嗎?
提前致謝。
檔案相關頁面:https : //nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
uj5u.com熱心網友回復:
感謝您加入 Stack Overflow!,我必須說您的問題非常好!
如下圖所示:

該圖來自事件回圈和大圖 — NodeJS 事件回圈第 1 部分 作者 Deepal Jayasekara
“圓圈周圍的方框說明了我們之前看到的不同階段的佇列,中間的兩個方框說明了從一個階段移動到另一個階段之前需要耗盡的兩個特殊佇列。“下一個滴答佇列”處理回呼通過 nextTick() 注冊,...”
來自Synk - Node.js Event-Loop:即使是快速的 Node.js 異步函式也能阻塞 Event-Loop,餓死 I/O參考上面的文章
所以setTimeout,setImmediate和之間的區別nextTick是:
setTimeout安排腳本在經過以毫秒為單位的最小閾值后運行。1setImmediate在輪詢階段之后運行(池階段是圖中的 IO 事件佇列)nextTick在階段之間運行。
1定時器的執行順序將根據呼叫它們的背景關系而有所不同,請參閱此處了解更多資訊
uj5u.com熱心網友回復:
簡單回答:
setImmediate 在下一個刻度上運行。
細節:
setImmediate并且setTimeout都在事件回圈的不同階段運行。
這就是為什么當setTimeout設定為零延遲時它不會立即運行。使用始終在事件回圈的下一個滴答上運行的 setImmediate。
但
process.nextTick基本上不關心事件回圈的階段。您分配給此方法的回呼將在當前操作完成后和事件回圈繼續之前執行。
您鏈接的檔案對差異有很好的解釋。我將在這里吸引您注意幾點。在setimmediate-vs-settimeout中,呼叫順序是不確定的,除非它們被安排在 I/O 周期內,如下例所示。
現在添加process.nextTick到示例中
const fs = require('fs');
// I/O cycle
fs.readFile(__filename, () => {
setTimeout(() => {
console.log('timeout');
}, 0);
setImmediate(() => {
console.log('immediate');
});
});
process.nextTick(() => {
console.log('nextTick')
})
輸出:
nextTick
immediate
timeout
如果您運行上面的代碼,則process.nextTick函式中的任何內容都將首先執行。原因是,它在事件回圈繼續之前運行。請記住,setTimeout和setImmediate都與事件回圈相關,但與 process.nextTick 無關。
使用process.nextTick. 如果您沒有正確使用它,您最終可能會陷入糟糕的境地。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/327508.html
