gpt4 book ai didi

javascript - 使用 Javascript Promises,是否有关于使用 "error"与 catch 子句的最佳实践?

转载 作者:行者123 更新时间:2023-12-03 08:18:54 24 4
gpt4 key购买 nike

在学习使用 Promise 编写 JavaScript 时,我遇到了两种不同的错误处理方式。一种是使用 catch ,如本例所示:

axios.post('/someapi', {
somedata1: 'foo'
})
.then((result) => {
console.log(result);
})
.catch((exception) => {
console.log(exception);
});

另一种是在 then中有一个子句。对于被拒绝的情况:
axios.post('/someapi', {
somedata1: 'foo',
})
.then((response) => {
console.log(response);
}, (error) => {
console.log(error);
});

有些作者似乎使用一种方法,其他作者使用另一种方法,我不清楚为什么。在某些情况下是否有必要或希望使用其中一种?

(上面的例子使用了 axios,但这只是为了提供一个代码示例。这个问题与 axios 无关。)

最佳答案

With Javascript Promises, are there best practices regarding the use of “error” versus catch clauses?



该问题没有通用的“最佳实践”,因为这取决于您希望代码具有的特定行为。正如其他人所提到的,您会通过几种方式获得不同的行为。

Some authors seem to use one approach, other authors use the other, and it's not clear to me why. Are there situations in which it's necessary or desirable to use one or the other?



是的,在某些情况下可以使用其中一种。它们提供了潜在的不同行为。只有当您 200% 确定您的 successHandler.then(successHandler)永远不能抛出或返回一个被拒绝的 promise ,会不会有任何有意义的区别。

作为总结:

使用时 p.then(successHandler).catch(errorHandler) , errorHandler将收到来自被拒绝的 p 的错误。或来自 successHandler 的错误或拒绝.

使用时 p.then(successHandler, errorHandler) , errorHandler将从 p 的拒绝中调用并且不会因为来自 successHandler 的错误或拒绝而被调用.

对不同情况有用的不同行为。

在此 .catch()下面的例子, .catch()将捕获发生的错误(偶然来自编码错误、抛出的异常或返回其他拒绝的 promise 时)。

Promise.resolve("hello").then(greeting => {
console.log("throwing error");
throw new Error("My .then() handler had an error");
}).catch(err => {
// will get here
console.log("Caught error in .catch()\nError was: ", err.message);
});


但是,当对 .then() 使用第二个参数时,该错误来自 .then()处理程序不会被捕获:

Promise.resolve("hello").then(greeting => {
console.log("throwing error");
throw new Error("My .then() handler had an error");
}, err => {
// won't get here
console.log("Caught error in .catch()\nError was: ", err.message);
});



因此,有时您想要在 .then() 中可能发生的错误。处理程序来命中这个立即错误处理程序,有时您不希望它命中那个错误处理程序,因为您希望该错误处理程序只处理来自原始 promise 的错误,并且在 promise 链的后面还有一些其他的捕获处理程序可以处理这个错误。

推荐

一般来说,我建议您从 .catch() 开始。处理程序,因为它捕获更多错误并且不需要其他一些 .catch()为了安全起见,在 promise 链中其他地方的处理程序。然后,您切换到 .then(successHandler, errorHandler)如果您明确不想要此表单,请填写 errorHandler如果 successHandler 中存在另一个错误,将被调用并且您在 promise 链中还有其他地方,其中 successHandler 中出现错误会被捕获或处理。

关于javascript - 使用 Javascript Promises,是否有关于使用 "error"与 catch 子句的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62033060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com