es6 promise 执行顺序问题

const p1 = new Promise(function (resolve, reject) {
  setTimeout(() => reject(new Error('fail')), 3000)
})

const p2 = new Promise(function (resolve, reject) {
  setTimeout(() => resolve(p1), 1000)
})

p2
  .then(result => console.log(result))
  .catch(error => console.log(error)) // Error: fail 

上面代码中,p1是一个 Promise,3 秒之后变为rejectedp2的状态在 1 秒之后改变,resolve方法返回的是p1。由于p2返回的是另一个 Promise,导致p2自己的状态无效了,由p1的状态决定p2的状态。所以,后面的then语句都变成针对后者(p1)。又过了 2 秒,p1变为rejected,导致触发catch方法指定的回调函数。

以上是es6阮一峰入门的部分截取。里面说的是“又过了2秒”,这意思就是,p2开始执行settimeout计时的时候,p1也同时开始,1+2=3秒,但是不应该是p2执行,过了一秒后resolve(p1),p1又执行了3秒,一共是4秒吗???

阅读 2.3k
3 个回答

调用Promise构造函数时,其实参回调函数就执行了。在执行p2.then(xxxx)时,已经同时存在两个定时器任务了(一个3s后触发回调,一个1s后触发回调)。

定时器是两个宏任务。互不影响~

除非setTimeout包setTimeout才是时间叠加。

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