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
杨魅力
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的参数会进入异步队列。
添加回答
举报
0/150
提交
取消