静下心来的个人专栏
上一篇

链式Promise——捕捉错误

广告
选中文字可对指定文章内容进行评论啦,→和←可快速切换按钮,绿色背景文字可以点击查看评论额。
大纲

Promise捕获错误

在链式Promise中,允许捕捉在前一个Promise的fullfilment或者rejection handler中发生的错误,例如:

const promise = Promise.resolve(42);

promise.then(value => {
	throw new Error("Oops!");
}).catch(reason => {
	console.error(reason.message); // "Oops!"
});

在这段代码中promise的fullfilment handler抛出了一个错误;第二个promise的catch方法的链式调用可以通过其rejection handler接收该错误。如果rejection handler抛出错误,处理情况也是一样的。

const promise = new Promise((resolve, reject) => {
  throw new Error("Uh oh!");
});

promise.catch(reason => {
  console.log(reason.message); // "Uh oh!"
  throw new Error("Oops!");
}).catch(reason => {
  console.error(reason.message); // "Oops!"
});

在这里,执行器抛出了一个错误,触发了promise的rejection handler。然后该handler又抛出了另一个错误,这个错误被第二个promise的rejection handler捕获。链式调用的promise能够感知到其他promise中发生的错误。(注意:这里一定是在链中后面的promise感知前面的promise,不能发过来感知)。

你可以使用这个功能来捕获promise链中的错误,从而像使用try catch一样。考虑使用 fetch() 来检索一些数据并希望捕获发生的任何错误:

const promise = fetch("books.json");

promise.then(response => {
  console.log(response.status);
}).catch(reason => {
  console.error(reason.message);
});

此示例将在 fetch() 调用成功时输出响应状态,如果调用失败将输出错误消息。 您可以更进一步,通过检查 response.ok 属性(在第 1 章中讨论)并在它为 false 时抛出错误,将 200-299 范围之外的状态代码作为错误处理,如下例所示:

const promise = fetch("books.json");

promise.then(response => {
  if (response.ok) {
    console.log(response.status);
  } else {
    throw new Error(`Unexpected status code: ${response.status} ${response.statusText}`);
  }
}).catch(reason => {
  console.error(reason.message);
});

此示例中的链式 catch() 调用创建了一个rejection handler,该handler捕获 fetch() 返回的错误以及fullfilment handler中抛出的任何错误。因此,您无需使用两个不同的handler来捕获两种不同类型的错误,而是可以使用一个句柄来处理链中可能发生的所有错误。

在 Promise 链的末尾始终有一个拒绝处理程序,以确保您可以正确处理可能发生的任何错误。

总结:

在promise链的末尾总是捕获错误是一个优秀的最佳实践。

 

 

版权声明:著作权归作者所有。

X

欢迎加群学习交流

联系我们