JavaScript 中 Promise 的 catch() 函数

发布于 2022-09-04 11:29:42 字数 3140 浏览 197 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

凉薄对峙

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

1CH1MKgiKxn9p

文章 0 评论 0

ゞ记忆︶ㄣ

文章 0 评论 0

JackDx

文章 0 评论 0

信远

文章 0 评论 0

yaoduoduo1995

文章 0 评论 0

霞映澄塘

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文