不理解这个输出顺序?

Promise.resolve()
  .then(() => {
    console.log(0)
    return Promise.resolve(4)
  })
  .then(res => {
    console.log(res)
  })

Promise.resolve()
  .then(() => {
    console.log(1)
  })
  .then(() => {
    console.log(2)
  })
  .then(() => {
    console.log(3)
  })
  .then(() => {
    console.log(5)
  })
  .then(() => {
    console.log(6)
  })
阅读 1.1k
1 个回答
p = Promise.resolve()
  .then(() => {
    console.log(0)
    return Promise.resolve(4)
  })

then 的返回(p)是一个 promise 。它是用起回调的返回值来 resolve。

当返回是一个 promise 的时候(Promise.resolve(4) 是一个 promise。以后给它起个名字叫 p4 吧),p 不能立即 resolve ,所以它的 then 回调不会加入微任务队列。但是,它会在微任务队列加另一个任务,这个任务会调用 p4.then()。在这个微任务执行之后,打印了 2

p4.then()执行时,由于 p4 已经 resolve 了,于是它的回调被立即加入了微任务队列。它的回调将把 p 也置为 resolve 的状态,值是 4 。这个微任务之后,打印了 3

p 被置为 resolve 之后,它的 then 的回调(打印 res == 4)被放入了微任务队列。


用 Promise(p4) 来 resolve Promise(p) ,会生成一个微任务(微任务1),这个微任务会调用 p4.then(),then 的回调(微任务2)将使用 p4 的 resolve 值来 resolve p。也就是至少经过两个微任务 p 才能被 resolve。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题