Javascript 在异步/等待角度HttpClient方法中处理错误

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

我试图使用异步/等待模式来处理一个场景,如果不是这样实现的话,这个场景可能会被视为“回调地狱”

这是一个极其简化的代码版本。真正的代码大约有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(或我测试过的任何其他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