为什么在 Promise.reject() 上使用 catch 会将其更改为已完成的 Promise?

问题描述 投票:0回答:2

今天我只是在探索 JavaScript 中的 Promise,我发现了这个:

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 }

我得到的部分是,在后者中,拒绝被捕获,因此只是一条正常的控制台消息,但为什么承诺本身在被拒绝时变成了履行。

javascript es6-promise
2个回答
1
投票

调用

.catch
将返回一个 pending 承诺。

待决承诺是否会实现取决于:

  1. 它所依据的应许。如果承诺履行,那么

    catch
    承诺将效仿并解决相同的结果,而无需执行作为参数传递的回调。

  2. 如果调用它的 Promise 被拒绝(如您的示例中所示),则执行回调(作为参数传递给

    catch
    )。此执行确定如何解决
    catch
    返回的承诺(未决)。例如,如果回调抛出错误,则该 Promise 实际上将处于拒绝状态。

演示:

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!");
});


0
投票

每个

Promise.then
Promise.catch
都会返回一个已履行的承诺,其中包含从
function
处理程序返回的值并赋予
then
catch
子句。

让我们看一下您的代码。

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

第一个

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.