【发布时间】:2019-09-30 20:14:09
【问题描述】:
我有以下代码,简化以省略不必要的代码:
try {
const response = await axios.put(url, {});
if ( response.status === 200 ) {
MicroService.action(data);
}
} catch ( error ) {
// user is not signed in, so send to create-account/sign-in
if (error.status === 401) {
MicroService.otherAction(data);
} else {
console.error(`The server returned an unexpected ${error.status} error upon attempting to hit ${url}`);
}
}
问题在于catch 子句还捕获了第四行MicroService.action(data) 中发生的任何错误。我只是想在第 2 行的 axios 调用中捕获一个错误,不应消除其他错误。
但是如果我将MicroService.action(data) 移动到catch 之后,那么即使try 失败也会发生,这是错误的。只有当try 成功时才会发生。
我可以在try 子句中设置一个变量,例如if (response.status === 200) let success = true;,然后在 catch 子句之后检查该变量。但是除了最简单的情况之外,这对于任何事情都感觉混乱和不雅。
有更好的方法吗?
【问题讨论】:
-
你有没有试过在 catch 之后放置一个
finally块?这样它将在您的 axios 调用完成后执行。但是,您必须将您的response变量声明为let并将其移到您的尝试之外。 MDN Try/Catch 在查看更多文档后,它确实说无论是否有异常它都会执行。所以这并不能解决我认为的问题。 您可以尝试 promsify 调用Microservice.action(data),并在 try 块中捕获它。 -
@EvanBechtol 也可以在
try中将其声明为var。 -
我认为既然 OP 似乎在使用 ES6 语法,var 会破坏样式一致性
-
还有你的主题
How to structure try/catch with async/await?,如果你不使用async/wait,你会这样做,而axios.put是一个同步请求。 -
@PatrickRoberts 当我读到这个问题时,它似乎根本没有针对 axios。当我阅读您的答案时,我发现 axios-specific 解决方案是这种情况下的最佳方法(+1),但问题本身仍然是(非常好的)重复。
标签: javascript ecmascript-6 async-await