理解 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 队列。一个 Promise.then() 回调被添加到 promises 微任务队列。一个 setTimeout, setImmediate 回调被添加到 宏任务队列

事件循环首先执行 process.nextTick 队列 中的任务,然后执行 promises 微任务队列,最后执行 宏任务队列

以下是一个示例,展示了 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 队列 中调用 foo()。之后,它会处理 promises 微任务队列,同时打印 bar 并将 zoo() 添加到 process.nextTick 队列 中。然后它会调用刚刚添加的 zoo()。最后,macrotask 队列 中的 baz() 被调用。

阅读时间
2 分钟阅读
贡献
编辑此页面