还有 setTimeOut(fn, 0) 更好的替代方法吗?

问题描述 投票:0回答:2

是否有另一种方法可以实现相同的行为,即在 JavaScript 的 消息队列 上调度回调函数以在当前 stack 为空后运行?

换句话说,有没有办法,无论是使用

Promises
还是第三方包,将回调推送到任务队列,以便它在当前堆栈为空后运行?

换句话说,将

0
传递给
setTimeout
以利用异步回调的一些等效/替代方法是什么?

欢迎针对所有环境和所有 ECMAScript 版本提供答案。

javascript asynchronous promise callback settimeout
2个回答
5
投票

在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");


0
投票

使用

queueMicrotask
。它在控制权返回到事件循环之前运行,因此它将被安排在
setTimeout(fn, 0)
之前执行。

示例:

setTimeout(() => console.log('setTimeout'), 0)
queueMicrotask(() => console.log('queueMicrotask'))

输出:

queueMicrotask
setTimeout

在时间安排上,

queueMicrotask(fn)
相当于
Promise.resolve().then(fn)
,表明
Promise
是使用
queueMicrotask
来安排的。

© www.soinside.com 2019 - 2024. All rights reserved.