Promise.resolve() 函数如何工作?在将被拒绝的承诺作为参数传递给 Promise.resolve() 函数时,我得到两个不同的输出

How do Promise.resolve() function works? I am getting two different output on passing rejected promise as argument to Promise.resolve() function

我在 Promise.resolve() 函数的参数中传递了被拒绝的承诺。在第一种情况下,我通过函数 foo() 传递被拒绝的承诺,在第二种情况下,我通过在 Promise.resolve() 函数的参数中创建一个新的承诺来传递被拒绝的承诺。

案例 1:

function foo(){
 return new Promise((resolve,reject)=>{
  reject("Function foo failed");
 });
}
Promise.resolve(foo)
.then(
()=>{console.log("Success");},
()=>{console.log("Failure");}
);

案例二:

Promise.resolve(
new Promise((resolve,reject)=>{reject("Failure");
})
)
.then(
()=>{console.log("Success");},
()=>{console.log("Failure");}
);

在情况 2 中,输出符合预期,输出为 "Failure"。但是在案例 1 中,输出是 "Success",但在这种情况下(案例 1),我期望 "Failure" 也是因为我传递了一个被拒绝的承诺。所以想问一下为什么case 1的输出是"Success"而不是"Failure"?

在第一种情况下,您传递的是对函数的引用。当您将不是承诺的内容传递给 Promise.resolve() 时,它会自动 returns 已解决的承诺。

要在第一种情况下获得预期的输出,请这样说:

Promise.resolve(foo()) - 注意 foo() 调用函数 foo 而不是 foo 只是传递一个引用。

我不确定是否有人已经完全解释了这里到底发生了什么,所以我将尝试对发生的事情进行更深入的讨论。

让我们看看 Promise.resolve() 实际做了什么。它创建一个新的承诺并获取您传递给它的价值,并将其作为新承诺的已解决价值。一个例外是,如果您传递给它的值是一个承诺本身,那么它会将这个承诺链接到新创建的承诺,并且新创建的承诺的值将跟踪您传递给它的承诺的值,包括它是解决还是拒绝。

所以,现在你的情况 1:

    function foo(){
     return new Promise((resolve,reject)=>{
      reject("Function foo failed");
     });
    }
    
    Promise.resolve(foo).then(
        ()=>{console.log("Success");},
        ()=>{console.log("Failure");}
    );

您传递的值 Promise.resolve() 是函数引用 foo。不调用该函数。因此,您得到的是一个新创建的承诺,其解析值是函数引用 foo(本质上是指向函数 foo 的指针)。请注意 foo() 永远不会被调用。您只是在传递对函数 foo.

的引用

现在,在你的情况下 2:

    Promise.resolve(
        new Promise((resolve,reject)=>{reject("Failure");})
    ).then(
        ()=>{console.log("Success");},
        ()=>{console.log("Failure");}
    );

此处您传递的值 Promise.resolve() 是一个被拒绝的承诺。因此,Promise.resolve() 创建了一个新的 promise,它将跟踪该 promise 的值和 resolve/reject 状态。所以,你得到了预期的 "Failure" 输出。


如果我们在案例 3 中实际调用了 foo() 并将其 return 值传递给 Promise.resolve(),如下所示:

    function foo(){
     return new Promise((resolve,reject)=>{
      reject("Function foo failed");
     });
    }
    
    // call foo() and pass its return value to Promise.resolve()
    Promise.resolve(foo()).then(
        ()=>{console.log("Success");},
        ()=>{console.log("Failure");}
    );

然后,您将获得预期的 "Failure" 输出。