Rx Js throwError не вызывает перехват в Promise - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть вызов API, который преобразуется в обещание. Моя функция handleError внутри наблюдаемых повторных бросков через throwError. Эта повторно выданная ошибка не вызывает какой-либо перехват во внешней цепочке Promise.

callApi() {    
  return this.http.get(`${this.baseUrl}/someapi`)
    .pipe(
      map((data: any) => this.extractData(data)),
      catchError(error => this.handleError(error))
    ).toPromise();

handleError(error) {
  console.error(error);
  return throwError(error || 'Server error');
}

Код вызова ...

this.someService.callApi()
  .then((response) => {
    // THIS GETS CALLED AFTER throwError
    // do something cool with response
    this.someVar = response;
  })
  .catch((error) => {
    // WE NEVER GET TO HERE, even when I force my api to throw an error
    console.log(`Custom error message here. error = ${error.message}`);
    this.displayErrorGettingToken();
  });

Почему throwError не вызывает перехват Promise?

1 Ответ

0 голосов
/ 28 февраля 2020

Вы не должны использовать toPromise(), когда это возможно. Используйте подписаться вместо того. Кроме того, когда вы перехватываете ошибку в канале, она не будет добавлена, потому что вы уже перехватили ее, также, когда вы выдает ошибку в ошибке перехвата, она не будет отправлена ​​в обычный поток канала вашего ответа.


callApi() {    
  return this.http.get(`${this.baseUrl}/someapi`);
}

Это совершенно нормально. Http.get() возвращает одноэлементный наблюдаемый поток, который выдает только ОДНО значение и затем завершается Подпишитесь на Observable.


this.someService.callApi()
  .subscribe((response) => {
    // THIS GETS CALLED always wenn everything is ok
    this.someVar = response;
  }, 
  (error:HttpErrorResponse) =>{
       console.log(`Custom error message here. error ${error.message}`);
    this.displayErrorGettingToken();
  }); 

Observable похоже на расширенную версию обещания. Используй это.

...