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 秒之后变为rejected
。p2
的状态在 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秒吗???
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
调用
Promise
构造函数时,其实参回调函数就执行了。在执行p2.then(xxxx)
时,已经同时存在两个定时器任务了(一个3s后触发回调,一个1s后触发回调)。定时器是两个宏任务。互不影响~
除非setTimeout包setTimeout才是时间叠加。
在两个settimeout前都执行console语句打印当前时间戳,就能知道两个settimeout注册的时间差
在两个settimeout的函数中都执行console语句打印当前时间戳,就能知道两个settimeout执行的时间差
自己动手试试