Обработка ошибок в асинхронном / ожидающем методе Angular HttpClient - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь использовать шаблон асинхронного ожидания / ожидания для обработки сценария, который можно было бы считать «адом обратного вызова», если реализован иначе.

Вот крайне тупая версия кода.Реальный код содержит около 5 условных вызовов HttpClient, основанных на данных из первого вызова (не мои api ...), что является причиной того, почему я в первую очередь использую шаблон 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-состояние, с которым я тестировал)

Устройство, с которым я тестирую, - это Pixel 2 с P, и данные консоли поступают из сеанса инспектора устройств Chrome.

Любой совет был бы весьма полезен.приветствуется.

** Редактировать: Это явно проблема с сочетанием ионного и углового ... Это должно работать ...

** Редактировать: получается на 100%Угловой вопрос ... Не сама структура, а то, как был реализован перехватчик.Я оставлю это здесь вместо того, чтобы удалять вопрос в том редком случае, когда это требуется кому-то другому.

1 Ответ

0 голосов
/ 21 сентября 2018

Если я правильно понял ваш вопрос, вы хотите делать каскадные вызовы, поэтому вы делаете запрос 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 способом.

См. каскадные звонки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...