今天我只是在探索 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 }
我得到的部分是,在后者中,拒绝被捕获,因此只是一条正常的控制台消息,但为什么承诺本身在被拒绝时变成了履行。
调用
.catch
将返回一个 pending 承诺。
待决承诺是否会实现取决于:
它所依据的应许。如果承诺履行,那么
catch
承诺将效仿并解决相同的结果,而无需执行作为参数传递的回调。
如果调用它的 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!");
});
每个
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?";
});