Как RxJS ловит ошибки под капотом? - PullRequest
0 голосов
/ 01 декабря 2018

Я использовал rxjs в Angular, и я знаком с использованием оператора catchError в потоке pipe, особенно для вызовов HttpClient (XHR)

Мой вопрос: какоперация catchError работает?Как это ловит ошибку под капотом?

https://www.learnrxjs.io/operators/error_handling/catch.html

import { throwError, of } from 'rxjs';
import { catchError } from 'rxjs/operators';
//emit error
const source = throwError('This is an error!');
//gracefully handle error, returning observable with error message
const example = source.pipe(catchError(val => of(`I caught: ${val}`)));
//output: 'I caught: This is an error'
const subscribe = example.subscribe(val => console.log(val));

Обновление:

Используя детали из принятого ответа,Я проверил это с помощью следующего в проекте StackBlitz TypeScript.Хороший пример, чтобы увидеть использование try / catch и subscriber.error:

import { throwError, of, Observable } from 'rxjs';
import { catchError, map } from 'rxjs/operators';

const exampleOne$ = new Observable(subscriber => {
  throw new Error('thrown');
});

exampleOne$.pipe(
  catchError(val => of(`Exmaple One ${val}`))
).subscribe(console.log); // Exmaple One Error: thrown

const exampleTwo$ = new Observable(subscriber => {
  try {
    throw new Error('native error')
  }
  catch (e) {
    subscriber.error(e);
  }
});

exampleTwo$.pipe(
  catchError(val => of(`Example Two ${val}`)) 
).subscribe(console.log); // Example Two Error: thrown

1 Ответ

0 голосов
/ 01 декабря 2018

Оператор catchError напрямую не перехватывает ошибки так же, как и исключения, используя оператор try / catch.

Внутренне он подписывается на источник, наблюдаемый для него.применяется и отражает исходные уведомления next и complete - то есть эти уведомления проходят через оператора без изменений.

Однако, если оператор получает уведомление error, он передает ошибкупредоставленный обратный вызов, предоставляющий вызывающему оператору возможность обработать ошибку.

Уведомление error может быть выполнено в наблюдаемой реализации путем вызова метода error подписчика, например:

const source = new Observable<string>(subscriber => {
  subscriber.error(new Error'Kaboom!'));
});

Здесь не выдается исключение, и try / catch не требуется.Ошибка передается подписчику - оператор catchError подписывается на источник, поэтому это подписчик - с помощью его метода error.

Так использовалась функция throwErrorв вопросе реализовано .

Уведомление error также можно выполнить, вызвав исключение, например:

const source = new Observable<string>(subscriber => {
  throw new Error('Kaboom!');
});

Здесь try/ catch оператор в реализации Observable.subscribe перехватит исключение и передаст подписчику уведомление об ошибке, вызвав метод error подписчика.

Перехват брошенногоИсключением является ответственность Observable и реализаций операторов.

Везде, где передаются пользовательские функции - например, в таких операторах, как map - вызовы этих функций заключены в try / catch операторов и любые обнаруженные исключения передаются подписчику в виде error уведомлений через метод error подписчика.

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