Javascript 在异步/等待角度HttpClient方法中处理错误
我试图使用异步/等待模式来处理一个场景,如果不是这样实现的话,这个场景可能会被视为“回调地狱” 这是一个极其简化的代码版本。真正的代码大约有5个基于第一个调用(不是我的api…)的数据的有条件HttpClient调用,这就是我首先使用async/await模式的原因Javascript 在异步/等待角度HttpClient方法中处理错误,javascript,angular,typescript,ionic-framework,Javascript,Angular,Typescript,Ionic Framework,我试图使用异步/等待模式来处理一个场景,如果不是这样实现的话,这个场景可能会被视为“回调地狱” 这是一个极其简化的代码版本。真正的代码大约有5个基于第一个调用(不是我的api…)的数据的有条件HttpClient调用,这就是我首先使用async/await模式的原因 async blah(): Promise<boolean> { try { let resp = await this.http.get("https://httpstat.us/500").t
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(或我测试过的任何其他http状态)
我正在测试的设备是运行p的Pixel 2,控制台数据来自Chrome设备检查器会话
如有任何建议,将不胜感激
**编辑:这显然是离子和角度结合的问题。。。它应该有用
**编辑:结果100%是一个角度问题。。。不是框架本身,而是如何实现拦截器。我将把这个问题留在这里,而不是在很少有人需要的情况下删除这个问题。如果我正确地回答了您的问题,那么您需要执行级联调用,因此您可以发出http请求,并根据响应执行另一个http调用。如果是这样的话,那么你应该考虑使用<代码>开关图< /代码>运算符:
this.http.get(“https://httpstat.us/500管道(
开关映射(结果=>{
如果(结果a==5){
返回此.http.get(“某些服务器api url”);
}
返回this.http.get(“另一个服务器api url”);
})
)
然后以rxjs
的方式处理错误
请参见
blah()
正在返回true
,而不是承诺。@ChrisG不正确,该方法定义为async
,因此它将始终返回承诺(此处解析为true
)。您的代码工作正常,在stackblitz()中测试。也许是一些离子问题?只是一个猜测-你使用什么rxjs版本?如果您使用的是较旧的版本,则需要导入toPromise
操作符(对于已经存在的v6来说)。@MartinAdámek我目前使用的是“rxjs”:“5.5.8”…我稍微编辑了我的问题。对API的后续调用有时是有条件的,基于以前调用的数据。。。这可以通过管道和开关映射组合来实现吗?请参阅更新。问题是后续调用是否会以相同的结构获取数据,如果不是,那么您的observable将是类型的并集,比如observable
,我将尝试一下,因为在我的场景中,我根本无法让这个async+toPromise()调用工作。。。这毫无意义!
polyfills.js:3 GET https://httpstat.us/500/ 500 (Internal Server Error)
main.js:927 you should not see this
main.js:940 okokokok