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

标签 javascript es6-promise

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

案例一:

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 中,输出是“成功”,但在这种情况下(案例 1)我预计会出现“失败”,因为我传递了一个被拒绝的 promise 。所以我想问一下为什么case 1的输出是“Success”而不是“Failure”?

最佳答案

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

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

那么,现在您的情况 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。不调用该函数。因此,您得到的是一个新创建的 promise ,其解析值是函数引用 foo(本质上是指向函数 foo 的指针)。请注意,永远不会调用 foo()。您只是传递对函数 foo 的引用。

现在,对于您的情况 2:

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

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


如果我们在案例 3 中实际调用了 foo() 并将其返回值传递给 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");}
    );

然后,您将获得预期的“失败”输出。

关于javascript - Promise.resolve() 函数如何工作?在将被拒绝的 promise 作为 Promise.resolve() 函数的参数传递时,我得到两个不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57451033/

相关文章:

javascript - 在进行获取调用之前检查条件

Javascript - 处理异步竞争条件

javascript - 坚决 promise 并拒绝作为属性(property),这是一种反模式吗?为什么?

javascript - 放大缩小到多张照片

javascript - "Class"属性不起作用

javascript - 在 NodeJS 中转义多个嵌套函数

javascript - 使用 jest.unmock 测试 Promise

javascript - d3 selectAll 困惑

javascript - 使用另一个数组中的值对对象数组进行排序

javascript - Bokeh - 如何让 HoverTool 工具提示在点击时保持在点上?