В RxJS какая разница между ошибкой обратного вызова и .catch ()? - PullRequest
0 голосов
/ 04 октября 2018

Если у меня есть код, подобный приведенному ниже:

const d: any = {};

return this.http.post(url, body, httpOptions).map(data => {
  return d;
}, error => {
  console.error('error');
})
.catch((err, d$) => {
  return Observable.of(d);
});

и если есть какая-либо ошибка, например, сбой запроса POST или какая-либо ошибка в обратном вызове .map() success или любая другая ошибка.

Какой из двух обработчиков ошибок будет вызван обратным вызовом ошибки в обратном вызове .map() или .catch()?Зависит ли это от типа ошибки, которая может произойти?

Будет ли обратный вызов ошибки на .map() всегда пропускаться из-за присутствия оператора .catch()?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Если честно - я никогда не видел такой синтаксис, и я считаю, что он неправильный:

.map(data => {
  return d;
}, error => {

error - это один из трех обратных вызовов метода Observable subscribe().Он срабатывает один раз - если происходит ошибка.Но оператор Rxjs catch возвращает Observable .Вот главное отличие - вы можете ретранслировать его для продолжения вашего потока.

0 голосов
/ 04 октября 2018

В вашем примере улов будет вызван, если произошла ошибка.Кроме того, оператор map не имеет второго аргумента, поэтому функция никогда не будет вызываться.Если у вас есть обработчик ошибок в подписке, обратный вызов будет вызван, если произойдет необработанное исключение.Оператор catchError - это способ обработки ошибок.В основном он действует как switchMap для переключения на новый наблюдаемый поток.

Примеры:

Подписаться на обработчик ошибок ( Demo )

return throwError('This is an error!').subscribe(data => {
  console.log("Got Data: ", data);
}, error => {
  console.error('error', error); // Observable stream has error so this prints
});

Перехват ошибок ( Демо )

return throwError('This is an error!').pipe(
  catchError(error => {
    console.log("Error Caught", error);
    return of(2); // Catches the error and continues the stream with a value of 2
  }),
).subscribe(data => {
  console.log("Got Data: ", data); // Data will be logged
}, error => {
  console.error('error', error); // Will not be called
});

Перехват ошибок и повторный бросок ( Демо )

return throwError('This is an error!').pipe(
  catchError(error => {
    console.log("Error Caught", error);
    return throwError(error); // Catches the error and re-throws
  }),
).subscribe(data => {
  console.log("Got Data: ", data);
}, error => {
  console.error('error', error); // Observable stream has error so this prints
});
...