为了账号安全,请及时绑定邮箱和手机立即绑定

promise执行顺序是怎么样的?

promise执行顺序是怎么样的?

梦里花落0921 2019-06-13 10:10:55
varp2=newPromise(resolve=>{setTimeout(()=>{resolve()},2000)})varp1=newPromise(resolve=>{resolve(p2)})p1.then(data=>{console.log('p1')})p2.then(data=>{console.log('p2')console.log('p1status',p1)//这里在浏览器输出的是pending状态Promise.resolve().then(()=>{console.log('here')//然后这里会优先于p1.then()输出})})请问一下,p1的状态到底什么时候才会改变呢?为什么执行到console.log('p1status',p1)时候,p1的状态是pending呢?万分感谢~
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

setTimeout定时为0也不是同步马上执行,而是异步执行。
Promise函数会同步执行。
Promise中的resolve执行后,then()不是同步执行,而是异步执行。
Promise里提供的resolve、reject参数是异步的,所以会晚于同步代码。如果resolve函数里的参数是一个Promise实例,那么会等待这个实例的状态改变后才会改变状态。所以p1.then里的函数最后执行,因为p1的状态要等p2的状态确定后才能改变,所以执行到console.log('p1status',p1)时候,p1还没有改变状态。不好理解的话,我之前写了个Promise实现,你对比着上面的话看下。学习并实现一个Promise
查看完整回答
反对 回复 2019-06-13
?
杨魅力

TA贡献1811条经验 获得超6个赞

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的参数会进入异步队列。
                            
查看完整回答
反对 回复 2019-06-13
  • 2 回答
  • 0 关注
  • 1210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信