是否有另一种方法可以实现相同的行为,即在 JavaScript 的 消息队列 上调度回调函数以在当前 stack 为空后运行?
换句话说,有没有办法,无论是使用
Promises
还是第三方包,将回调推送到任务队列,以便它在当前堆栈为空后运行?
换句话说,将
0
传递给 setTimeout
以利用异步回调的一些等效/替代方法是什么?
欢迎针对所有环境和所有 ECMAScript 版本提供答案。
在nodejs环境中,您可以通过以下方式执行异步任务。
参考。 https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
setImmediate(() => console.log("setImmediate"));
setTimeout(() => console.log("setTimeout"));
Promise.resolve().then(() => console.log("Promise"));
process.nextTick(() => console.log("nextTick"));
console.log("sync");
输出:
sync
nextTick
Promise
setTimeout
setImmediate
在现代浏览器中,您可以通过以下方式执行异步任务。
setTimeout(() => console.log("setTimeout"));
Promise.resolve().then(() => console.log("Promise"));
console.log("sync");
queueMicrotask
。它在控制权返回到事件循环之前运行,因此它将被安排在 setTimeout(fn, 0)
之前执行。
示例:
setTimeout(() => console.log('setTimeout'), 0)
queueMicrotask(() => console.log('queueMicrotask'))
输出:
queueMicrotask
setTimeout
在时间安排上,
queueMicrotask(fn)
相当于Promise.resolve().then(fn)
,表明Promise
是使用queueMicrotask
来安排的。