从MDN中Promise构造函数的参数执行器的图示
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
,我知道executor的执行是异步的。
当我在执行器中解析一个值时,诺言立即解决了,但是如何在执行器中解析一个已解决的诺言呢?
它处于待处理状态!执行者的执行不是异步的吗?
我陷入执行者的解决功能。
请参阅下面的代码,为什么p1处于待处理状态?

var p3 = new Promise( function(resolve,reject){
    resolve( "B" );
} );

var p1 = new Promise( function(resolve,reject){
    resolve( p3 );
} );

var p2 = new Promise( function(resolve,reject){
    resolve( "A" );
} );

console.log(p3);  //Promise {<resolved>: "B"}
console.log(p1);  //Promise {<pending>}
console.log(p2);  //Promise {<resolved>: "A"}

最佳答案

您实质上已经进行了设置,以使p1承诺可以通过p3承诺的已解析值来解析。但是,从承诺中获得任何已解决的值的方法是使用.then(),因此在p1内部,必须运行p3.then()才能获得已解决的值。但是,.then()永远不会立即发生。它总是发生在事件循环的将来。因此,您的console.log(p1)发生在事件循环的将来滴答之前,该循环从p3获取值。在p3.then()运行之前,p1仍待处理。

您可以想到以下代码:

var p1 = new Promise( function(resolve,reject){
    resolve( p3 );
});


像这样:

var p1 = new Promise( function(resolve,reject){
    p3.then(function(val) {
        resolve(val);
    }, function(err) {
        reject(err);
    });
});


而且,p3.then()总是在事件循环的将来时间运行,而不是立即运行。因此,p1保持为pending状态,直到在事件循环的将来时间间隔调用该p3.then()处理程序。



仅供参考,我希望您知道resolve(p3)通常是反模式,这只是一项学术练习。如果您正在等待的操作已经是一个Promise,则无需将其包装在另一个手动构建的Promise(反模式)中。取而代之的是,您将只使用已经具有的p3承诺,而不会在其周围包裹p1

关于javascript - 我被卡在promise构造函数的executor函数中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57601349/

10-11 08:16