下面是我摘自著名的YDKJS-Async&;Performance系列的代码片段,为了便于理解,我做了一些修改.
var p3 = new Promise( function(resolve,reject){
resolve( "B" );
} );
var p1 = new Promise( function(res,rej){
resolve( p3 ); // equivalent to p3.then(res)
} );
var p2 = new Promise( function(resolve,reject){
resolve( "A" );
} );
p1.then( function(v){
console.log("In p1");
console.log(p1);
} );
p2.then( function(v){
console.log("In p2");
console.log(p1);
} );
虽然记录结果的顺序与期望一致,但promise 状态p1显示为待定(在console.log(p1)
),这是我无法理解的.我试着通过图片(在最后)描述我到目前为止所理解的东西,这样你就可以纠正我哪里错了.
Result
在Stage 1:p1
解决了一个已经解决的promise ,p3
.我知道p1
仍然是悬而未决的,还不会解析出一个值.但我听说resolve(p3)
相当于
p3.then(res); // res is a resolve callback of p1
因此,基于这个假设,由于p3
既被解析又具有注册的处理程序(p1
的回调res
),因此它将被插入到微任务队列(MTQ)中.
在Stage 2:p2
,它被解析并有一个注册的处理程序(紫色),它将被附加到MTQ.
在Stage 3:现在由于堆栈上没有要执行的东西,首先插入到MTQ中的CB(黄色)将进入堆栈以供执行.
我的问题是:当res('B')
次执行时,是否会将p1
‘S状态标记为已完成?因为res是与p1
关联的回调.
由于p1
除了被实现之外已经有一个注册的处理程序(当p1.then
被调用时),它不会如Stage 4所示附加到MTQ吗?
如果是这样的话,为什么即使在Stage 5的时候,p1
仍然显示为等待?
在Stage 6:p1
是如何一下子得到满足的?
请帮助我理解我在下面的图画描述中哪里错了?