了解 setImmediate()
當您想要異步執行一段程式碼,但又希望盡快執行時,其中一個選項是使用 Node.js 提供的 setImmediate()
函式。
setImmediate(() => {
// run something
});
任何作為 setImmediate() 參數傳遞的函式都是在事件迴圈的下一次迭代中執行的回調函式。
setImmediate()
與 setTimeout(() => {}, 0)
(傳遞0毫秒超時)有何不同,以及與 process.nextTick()
和 Promise.then()
有何不同?
傳遞給 process.nextTick()
的函式將在事件迴圈的當前迭代中執行,當當前操作結束時。這意味著它將始終在 setTimeout
和 setImmediate
之前執行。
具有0毫秒延遲的 setTimeout()
回調與 setImmediate()
非常類似。執行順序將取決於各種因素,但它們都將在事件迴圈的下一次迭代中運行。
process.nextTick
回調被添加到 process.nextTick queue
。 Promise.then()
回調被添加到 promises microtask queue
。 setTimeout
、setImmediate
回調被添加到 macrotask queue
。
事件迴圈首先執行 process.nextTick queue
中的任務,然後執行 promises microtask queue
,最後執行 macrotask queue
。
以下是一個示例,顯示了 setImmediate()
、process.nextTick()
和 Promise.then()
之間的順序
const baz = () => console.log('baz');
const foo = () => console.log('foo');
const zoo = () => console.log('zoo');
const start = () => {
console.log('start');
setImmediate(baz);
new Promise((resolve, reject) => {
resolve('bar');
}).then(resolve => {
console.log(resolve);
process.nextTick(zoo);
});
process.nextTick(foo);
};
start();
// start foo bar zoo baz
此代碼首先調用 start()
,然後在 process.nextTick queue
中調用 foo()
。之後,它將處理 promises microtask queue
,這會打印出 bar
,同時在 process.nextTick queue
中添加 zoo()
。然後它將調用剛添加的 zoo()
。最後,將調用 macrotask queue
中的 baz()
。