理解 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 队列
。一个 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()
被调用。