javascript - 处理 async/await Angular HttpClient 方法中的错误
问题描述
我正在尝试使用异步/等待模式来处理可能被视为“回调地狱”的场景,如果以其他方式实现的话。
这是代码的一个极其简化的版本。真正的代码有大约 5 个基于第一次调用(不是我的 api ......)的数据的条件 HttpClient 调用,这就是我首先使用 async/await 模式的原因。
async blah(): Promise<boolean> {
try {
let resp = await this.http.get("https://httpstat.us/500").toPromise();
console.warn("you should not see this");
// the real code will logically call the api multiple times based on conditonal data from resp
// hence the attempted usage of async/await to avoid "callback hell"
// blah() will eventually return an object.
return true;
}
catch (err) {
console.error("caught inside blah()");
throw err;
}
}
ionViewDidLoad() {
this.blah().then(data => {
console.warn('okokokok');
}).catch(error => {
console.error(error)
});
}
发生了什么,我可以看到调用实际上是 500,但代码继续,并且以下内容打印到控制台:
polyfills.js:3 GET https://httpstat.us/500/ 500 (Internal Server Error)
main.js:927 you should not see this
main.js:940 okokokok
如您所见,它没有捕获 500(或我测试过的任何其他 http 状态)
我正在测试的设备是运行 P 的 Pixel 2,控制台数据来自 Chrome 设备检查器会话。
任何建议将不胜感激。
** 编辑:这显然是离子和角度组合的问题......它应该工作......
** 编辑:事实证明 100% 是 Angular 问题......不是框架本身,而是拦截器是如何实现的。我将把它留在这里,而不是在其他人需要它的极少数情况下删除问题。
解决方案
如果我正确理解了您的问题,您想要进行级联调用,因此您发出 http 请求并根据您想要进行另一个 http 调用的响应。如果是这种情况,那么您应该考虑使用switchMap
运算符:
this.http.get("https://httpstat.us/500").pipe(
switchMap( result => {
if(result.a === 5) {
return this.http.get("some server api url");
}
return return this.http.get("another server api url");
})
)
然后您处理错误rxjs
。
查看级联调用
推荐阅读
- javascript - JQuery 无法分配给“#back”上的属性“guid”:不是对象
- javascript - 如何验证用户是否点击了联系表格 7 提交后发送的验证链接?
- java - Java BasicDataSource 连接时卡住
- sql - 如何将此“2021 年 6 月 28 日 10:52:16 CDT (GMT-0500)”转换为 2021 年 6 月 28 日
- flutter - Riverpod - 以更好/优雅的方式创建具有异步依赖的服务
- javascript - 如何在 Typescript 的回调中访问类变量/方法?
- reactjs - 如何在子组件中传递道具以使用打字稿做出本机反应
- java - 来自具有 API 30 (android 11) 的三星物理模拟器的错误 Android 11 -> java.net.SocketTimeoutException
- javascript - 重命名所有键的对象JS
- javascript - 有没有办法让代码执行暂停 1 毫秒?我现在能做的最好是5ms左右