为什么在 Promise.reject() 上使用 catch 会将其更改为已履行的承诺?

今天我只是在探索 JavaScript 中的 Promises,我遇到了这个:

Promise.reject("Failed");

给予

Promise { <state>: "rejected",<reason>: "Failed" }
Uncaught (in promise) Failed

然而,

Promise.reject("Failed").catch((reason) => console.log(reason));

给予

Failed
Promise { <state>: "fulfilled",<value>: undefined }

我知道在后者中,拒绝被捕获,因此只是一条普通的控制台消息,但为什么承诺本身在被拒绝时变为已履行。

zhangqiupu2008 回答:为什么在 Promise.reject() 上使用 catch 会将其更改为已履行的承诺?

调用 .catch 将返回一个 pending 承诺。

那个未决的承诺是否会实现取决于:

  1. 调用它的承诺。如果承诺实现,那么 catch 承诺将效仿并解决相同的结果,而不会执行作为参数传递的回调。

  2. 如果调用它的承诺被拒绝(如您的示例中所示),则执行回调(作为参数传递给 catch)。此执行确定如何解决 catch 返回的承诺(未决)。例如,如果回调抛出错误,该承诺实际上将进入拒绝状态。

演示:

let p = Promise.reject();

let q = p.catch(() => {
    console.log("p rejected");
    // Return a promise that will reject 1 second later
    return new Promise((resolve,reject) => setTimeout(reject,1000));
});

let r = q.catch(() => {
    console.log("q rejected!");
});

,

每个 Promise.thenPromise.catch 都返回一个已履行的承诺,其值从 function 处理程序返回给 thencatch 子句。

让我们看看你的代码。

Promise.reject("Failed").catch((reason) => console.log(reason));

第一个 Promise.reject("Failed") 返回一个被拒绝的承诺,值为“失败”。 catch 子句具有箭头函数。你可能会问这个返回的箭头函数是什么? console.log 返回的值未定义。

你可能会问,你如何测试它?很简单,将其粘贴到您的控制台中。

Promise.reject("Failed").catch((reason) => {
 console.log(reason);
 return "Whoa,what is this?";
});

本文链接:https://www.f2er.com/21406.html

大家都在问