为什么随后的链式承诺得到解决

Why are consequent chained promises resolved?

本文关键字:承诺 解决 为什么      更新时间:2023-09-26

我试图了解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);
} );