javascript - 如何使用 async/await 构建 try/catch?
问题描述
我有以下代码,简化以省略不必要的代码:
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
子句之后检查该变量。但除了最简单的情况外,这对任何事情都感觉混乱和不雅。
有没有更好的方法来做到这一点?
解决方案
通过覆盖回调避免令人烦恼的异常。validateStatus
如果401
状态码是预期结果,则将其视为一个结果,并允许其他意外状态码正常抛出:
const response = await axios.put(url, {}, {
validateStatus (status) {
return [200, 401].includes(status);
}
});
switch (response.status) {
case 200:
MicroService.action(data);
break;
case 401:
MicroService.otherAction(data);
break;
}
如果您不希望任何状态代码引发错误,请在语句中添加一个default
案例:switch
const response = await axios.put(url, {}, {
validateStatus () {
return true;
}
});
switch (response.status) {
case 200:
MicroService.action(data);
break;
case 401:
MicroService.otherAction(data);
break;
default:
console.error(`The server returned an unexpected ${response.status} error upon attempting to hit ${url}`);
break;
}
推荐阅读
- javascript - 将循环转入箭头函数Javascript
- javascript - 如何在不使用 js 的情况下更改样式功能?
- bash - 如何获取文件中排序值的中位数?
- javascript - IG(交互式网格)Apex Oracle 上每页的行数
- node.js - Rest API 获取调用 - 将数据放入数组中 - 使用打字稿并做出反应
- php - 根据类别提供 3 种不同 % 折扣的优惠券
- r - 间隔必须包含两个元素
- css - 如何使用纯 CSS 来操作仅包含 td 元素的 HTML 表格,而无需编辑 HTML
- php - 使用 websockets 在服务和远程 api 之间进行交互
- python - 如何在循环内一一显示列表元素?