为什么随后的链式承诺得到解决
Why are consequent chained promises resolved?
我试图了解Promises/A+,我对几点感到困惑。考虑一下:
function foo() {
console.log("In 'foo' function: --> which returns a Promise");
return new Promise(function (resolve, reject) {
resolve()
});
}
var promise1 = foo();
var promise2 = promise1.then(function () {
console.log("Promise 1 has been resolved --> onFulfilled() returns a value");
return 1;
});
var promise3 = promise2.then(function () {
console.log("Promise 2 has been resolved --> onFulfilled() is not returning anything from inFulfilled()");
});
var promise4 = promise3.then(function () {
console.log("Promise 3 has been resolved");
});
/* Console:
In 'foo' function: --> which returns a Promise
Promise 1 has been resolved --> onFulfilled() returns a value
Promise 2 has been resolved --> onFulfilled() is not returning anything from inFulfilled()
Promise 3 has been resolved
*/
- 承诺 1 必须通过调用
resolve()
来显式解析,否则执行将停止。为什么在承诺 2 和 3 中,执行认为这些已解决(不需要resolve()
)并进入链中的下一个.then
? - 链接到promise2的'onFullfilled()'函数不返回值。我在规范中找不到任何明确的参考,说明在这种情况下应该发生什么。此方案是否被视为函数返回未定义?这是否取决于所用库的实际实现?
Promise 处理程序
(成功或错误处理程序)具有返回值。每个 then 调用都会创建一个新承诺。
如果返回值,则会自动解析承诺。 如果返回另一个承诺,则该承诺将等到它被解析或拒绝,然后再继续下一个然后调用承诺链。
我认为这解释了你所看到的行为。
您正在寻找的行为位于 promise/A+ 规范中的 #7 (https://github.com/promises-aplus/promises-spec#the-then-method)。
promise2 = promise1.then(onFulfilled, onRejected);
"如果 onFulfilled 或 onReject 返回值 x,请运行承诺解决过程 [[Resolve]](promise2, x)。"
我从中得到的是,当第一个承诺失败/解决时,从中创建的任何承诺(包括新的承诺promise2
)都会失败/解决。
例如:当您解决示例中的promise1
时,所有后续承诺也会解决。
我对你的代码做了一些小的调整:
- 将参数传递给
resolve(data)
例如resolve(1001)
- 在
.then
中检索并显示数据 - 同样在
.then
中返回链中的下一个承诺,并带有return new Promise
这是您返工的示例:
var promise1 = new Promise(function (resolve, reject) {
console.log("Creating Promise 1");
resolve( 1001 );
} );
var promise2 = promise1.then(function (data1) {
console.log("Promise 1 has been resolved --> ", data1);
return new Promise(function (resolve, reject) {
console.log("Creating Promise 2");
resolve( 1002 );
} );
} );
var promise3 = promise2.then(function (data2) {
console.log("Promise 2 has been resolved --> ", data2);
return new Promise(function (resolve, reject) {
console.log("Creating Promise 3");
resolve( 1003 );
} );
} );
promise3.then(function (data3) {
console.log("Promise 3 has been resolved --> ", data3);
} );
相关文章:
- 简单的ES6承诺问题-交换解决和拒绝参数
- RxJS等待承诺解决
- 如何在解决承诺之前和之后验证值
- AngularJS-我怎么知道何时解决了对父控制器的承诺
- 在我的案例中,如何解决我的承诺问题
- 所有承诺解决后返回
- $.当承诺解决得太早时
- 如果你用另一个承诺解决一个承诺会发生什么
- 基于另一个承诺解决承诺
- 承诺解决不了问题
- 如何知道什么时候所有的承诺都被拒绝了,或者用基本的js承诺解决了
- Ember RSVP承诺解决firefox插件端口消息传递方案无法解决的模型
- 客户端等待服务器承诺解决
- while(true)循环中的承诺/等待承诺解决
- 推迟承诺解决
- 用承诺解决jQuery延迟
- 等待多个单独的承诺解决
- EmberJS - 在承诺解决后调用超级操作
- 如何为另一个承诺解决一个承诺
- 为什么我的承诺散列在传递的承诺解决之前就解决了?