[英]Why does using catch on Promise.reject() changes it to a fulfilled promise?
今天我只是在探索 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 }
我得到的部分是,在后者中,拒绝被捕获,因此只是一条普通的控制台消息,但为什么承诺本身在被拒绝时变为已履行。
对.catch
的调用将返回一个挂起的承诺。
该未决承诺是否会兑现取决于:
调用它的承诺。 如果承诺实现,那么catch
承诺将效仿并解决相同的结果,而不会执行作为参数传递的回调。
如果调用它的承诺被拒绝(如您的示例中所示),则执行回调(作为参数传递给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.then
和Promise.catch
返回一个已履行的承诺,其值是从function
处理程序返回给then
或catch
子句的。
让我们来看看你的代码。
Promise.reject("Failed").catch((reason) => console.log(reason));
第一个Promise.reject("Failed")
返回一个被拒绝的 promise,其值为“Failed”。 catch
子句有一个箭头函数。 你可能会问这个返回的箭头函数是什么? console.log
返回的值未定义。
你可能会问,你如何测试它? 简单,将其粘贴到您的控制台中。
Promise.reject("Failed").catch((reason) => {
console.log(reason);
return "Whoa, what is this?";
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.