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!
});
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
请登录后查看评论内容