了解 setImmediate()

當您想要異步執行一段程式碼,但又希望盡快執行時,其中一個選項是使用 Node.js 提供的 setImmediate() 函式。

setImmediate(() => {
  // run something
});

任何作為 setImmediate() 參數傳遞的函式都是在事件迴圈的下一次迭代中執行的回調函式。

setImmediate()setTimeout(() => {}, 0)(傳遞0毫秒超時)有何不同,以及與 process.nextTick()Promise.then() 有何不同?

傳遞給 process.nextTick() 的函式將在事件迴圈的當前迭代中執行,當當前操作結束時。這意味著它將始終在 setTimeoutsetImmediate 之前執行。

具有0毫秒延遲的 setTimeout() 回調與 setImmediate() 非常類似。執行順序將取決於各種因素,但它們都將在事件迴圈的下一次迭代中運行。

process.nextTick 回調被添加到 process.nextTick queuePromise.then() 回調被添加到 promises microtask queuesetTimeoutsetImmediate 回調被添加到 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()

閱讀時間
2 分鐘閱讀
貢獻
編輯此頁面