从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/