JS 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 的状态到底什么时候才会改变呢?为什么执行到 console.log('p1 status ', p1) 时候,p1 的状态是 pending 呢?万分感谢~

阅读 2.3k
2 个回答

Promise里提供的resolve、reject参数是异步的,所以会晚于同步代码。

如果resolve函数里的参数是一个Promise实例,那么会等待这个实例的状态改变后才会改变状态。所以p1.then里的函数最后执行,因为p1的状态要等p2的状态确定后才能改变,所以执行到 console.log('p1 status ', p1) 时候,p1 还没有改变状态。

不好理解的话,我之前写了个Promise实现,你对比着上面的话看下。学习并实现一个Promise

resolve的参数p2是promise。p1的状态需要等p2的promise链完全执行完,才会改变。
也就是说,p1的then方法,一定在p2的最后一个then方法后面执行。

then方法是个异步操作。Promise.resolve()参数为空,就直接返回。
因此,p2的then方法内的Promise.resolve()的then方法的参数,会 优先 进入异步队列(比p1的then的参数早进入队列)。

p1等到p2的then方法返回undefined(这里没有显示返回一个值)后,状态就会改变。然后p1的then的参数会进入异步队列。

推荐问题
宣传栏