【发布时间】:2026-01-09 10:15:01
【问题描述】:
我在 Node 和 Chrome 中看到了这种行为:
setTimeout(()=>{ console.log('timeout') }, 0)
Promise.resolve().then(()=>{ console.log('promise') })
console.log('sync')
// output order:
// sync
// promise
// timeout
我的问题是,这是一致的行为吗?即,根据规范,在记忆/已解决的承诺上的 then 或 await 总是在 setTimeout(fn, 0) 之前触发吗?
我想在类似以下的情况下使用它,如果我在我的承诺中有记忆的结果,则返回一件事,如果没有,则返回另一件事:
// somewhere during object initialization
this.resultingPromise = expensiveAsyncFunction()
// in a method called frequently
Promise.race([
new Promise(resolve => setTimeout(() => resolve('default'), 0)),
this.resultingPromise
])
【问题讨论】:
-
我会冒险说逻辑表明它会一直这样工作。我不知道这两种机制的内部工作原理,但是如果您设置一个计时器,创建一个已解决的承诺,然后输出到控制台,我希望看到您显示的内容。 console.log 立即工作,然后创建计时器并设置执行回调,并执行已解决的承诺。然后,将执行计时器回调,因为这将是下一步 - 计时器倒计时为零。这对我来说听起来很明智,我相信 JS 是明智的。
-
Jake Archibald 的这篇文章可能有助于澄清这种行为:jakearchibald.com/2015/tasks-microtasks-queues-and-schedules
-
基于 *.com/a/36877743/5378743 总结点 2,您不能依赖订单。
-
感谢@ArnelleBalane,现在看到您在 kirill.buga 在下面的回答中发布了大致相同的内容。我想我应该阅读微/宏任务来理解这一点
标签: javascript promise async-await