Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Синхронное выполнение HTTP-запроса (https://javascript.ru/forum/angular/76313-sinkhronnoe-vypolnenie-http-zaprosa.html)

kotelok 27.12.2018 15:04

Синхронное выполнение HTTP-запроса
 
У компонента есть гвард, реализующий 'CanDeactivate', который производит вызов метода 'validate' компонента и на выходе ожидает 'true' или 'false'.

Сам метод 'validate' компонента выполняет обращение к сервису для проверки введённых пользователем данных.
validate(): boolean {
    httpClient.post("api/someservice/validate", userData)
  }
Подскажите, как правильно забрать результат выполнения, чтобы получилась следующая логика:
1. Если метод post вернул 200(OK) без тела, то метод возвращает 'true' и гвард разрешает запрошенную навигацию.
2. Если метод post завершился с ошибкой, то получить тело ответа, проанализировать его и, в зависимости от некоторой логики, вернуть либо 'true', либо 'false'.

Через простой 'subscribe', разумеется, не получается, т.к. его выполнения продолжается после того, как validate возвращает управление..
Через '.pipe(map(response =>' удаётся синхронно обработать 200ОК и вернуть true, но тем же способом не получается забрать тело из ошибки 500 из блока catch.

destus 09.01.2019 07:30

Цитата:

но тем же способом не получается забрать тело из ошибки 500 из блока catch.
Почему? .pipe(catchError(e => of(true или false)))

kotelok 16.01.2019 14:48

Получилось сделать по-другому, но за этот вариант тоже спасибо.

.flatMap(response => {
      return Observable.of(true);
    }).catch((error: HttpErrorResponse) => {
      var errorDto = error.error as SharedDto.ApiErrorDto;
      ....
    }

Ну и дальше уже детальный анализ как кода, так и тела ошибки.


Часовой пояс GMT +3, время: 17:38.