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!
});
© 版权声明
评论 抢沙发

请登录后发表评论