什么时候会检查 Promise 的状态呀?

var p2 = new Promise(resolve => {
  setTimeout(() => {
    resolve()
  }, 2000)
})

var p1 = new Promise(resolve => {
  resolve(p2)
})

p1.then(data => {
  console.log('p1')
})

p2.then(data => {
  console.log('p2')
  console.log('p1 status ', p1) // 这里在浏览器输出的是 pending 状态
  Promise.resolve().then(() => {
    console.log('here') // 然后这里会优先于 p1.then() 输出
  })
})

因为 p1 的状态是根据 p2 的状态来决定的嘛,然后啊,我在 p2.then() 里面调用 Promise.resolve().then() 都会比 p1.then() 优先输出。为什么呀?我猜是在下一个事件循环的时候才会去修改 p1 的状态?

有大佬指点一下吗,万分感激~

阅读 2.7k
2 个回答

在同一次循环中检测,但是也是有先后顺序的。

...

p1.then(data => {
  console.log('p1')//p1 fulfilled callback
})

p2.then(data => {
  console.log('p2')
  console.log('p1 status ', p1) // 这里在浏览器输出的是 pending 状态
  Promise.resolve()// p3 fulfilled
  .then(() => {//p3 fulfilled callback
    console.log('here') // 然后这里会优先于 p1.then() 输出
  })
  //p1 fulfilled
})

Promise.resolve()之前加上

setTimeout(()=>{
  console.log('setTimeout')
}, 0)

打印结果是

here
p1
setTimeout

说明是同一个事件循环, 我的理解是Promise.resolve()执行时状态实际已经fulfilled, p1 fulfilled在它之后, 执行回调顺序也应该是p1在后

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