JavaScript 中 Promise 的 catch() 函数
JavaScript 中的 Promise 是异步操作的对象表示。Promise 就像一些可能尚未计算的值的占位符。如果异步操作失败,JavaScript 将 拒绝 promise 。 catch()
function 告诉 JavaScript 在 promise 被拒绝时调用什么函数:
const p = Promise.reject(new Error('Oops!'));
p.catch(err => {
err.message; // 'Oops!'
});
使用 Promise 链
主要好处 .catch()
是您可以捕获在 承诺链 。
const p = Promise.resolve('Na');
return p.
then(str => str + ' Na').
then(str => str + ' Na').
then(str => str + ' Na').
then(() => { throw new Error('Batman!') }).
then(() => console.log('Will not print')).
catch(err => {
err.message; // 'Batman!'
});
这意味着您只需要一个 catch()
在 Promise 链的末尾处理 Promise 链中发生的任何错误!
重新抛出错误
您可以重新抛出错误 .catch()
,类似于 用 try/catch
。
const p = Promise.reject(new Error('Oops!'));
return p.
catch(err => { throw err; }). // Rethrow the error
catch(err => {
err.message; // 'Oops!'
});
这也意味着你应该非常小心在你的 .catch()
错误处理程序。如果您传递给的函数 .catch()
抛出,你没有另一个 .catch()
之后,你会得到一个 未处理的 promise reject 。
展开错误
如果你的 .catch()
返回一个值,您可以使用 解包 该值 await
或者 then()
。
const p = Promise.reject(new Error('Oops!'));
const answer = await p.catch(() => 42);
answer; // 42
return p.
catch(() => 42).
then(answer => {
answer; // 42
});
换句话说,您可以 使用类似 Golang 的语法来处理 JavaScript 中的异步错误 。
const p = Promise.reject(new Error('Oops!'));
const err = await p.catch(err => err);
err.message; // 'Oops!'
相对于 then()
catch()
之上的一层薄薄的语法糖 Promise then()
功能,回顾 then()
接受2个参数:
onFulfilled()
:如果底层异步操作成功,JavaScript 将调用此函数。onRejected()
:如果底层异步操作失败,JavaScript 将调用此函数。
所以 .catch(fn)
是一样的 .then(null, fn)
,换句话说,下面是一个单行 polyfill catch()
:
Promise.prototype.catch = function(onRejected) {
return this.then(null, onRejected);
};
这意味着您可以处理承诺错误 .then()
还有:
const p = Promise.reject(new Error('Oops!'));
return p.then(() => {}, function onRejected(err) {
err.message; // 'Oops!'
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论