首页 > 解决方案 > Javascript Async 和 Promise 在队列中搞砸了

问题描述

console.log(1)
setTimeout(()=>console.log(2),0)
Promise.resolve(3).then(console.log)
console.log(4)

考虑上面的代码。这是我对代码的期望。

但是输出是 1 4 3 2。你能向我解释一下这里实际发生了什么吗?

标签: javascriptasync-awaitpromise

解决方案


这是因为 Promise 有自己的队列,就像同步和异步操作之间一样。每次 promise 被解决或拒绝时,它的结果都会到达队列的最后。我想说这个例子更清楚地说明了这个案例:

  console.log(1)
  setTimeout(()=>console.log(2),0)
  Promise.resolve(3).then(console.log).then(()=>console.log("three"))
  Promise.resolve(5).then(console.log).then(()=>console.log("five"))
  console.log(4)

1和4一一出现,因为它是同步操作。然后整个 promises 队列出来了,每个新的“then”都添加到最后。最后,我们得到 setTimeout 结果。


推荐阅读