Обычно нет необходимости разбивать Observable только для обработки ошибок.Вместо этого мы можем использовать функцию создания throwError
для создания уведомления об ошибке.Уведомления об ошибках обрабатываются отдельно при вызове subscribe
(второй параметр subscribe
- это функция, вызываемая при ошибке).
Типичный пример пользовательской обработки ошибок может выглядеть следующим образом:
$httpSource.pipe(
mergeMap(res =>
res.error ?
throwError(res.error) :
of(res.value)
),
tap(next => ..., err => ...)
).subscribe(
next => ...,
err => ...
)
Я использую mergeMap
, потому что throwError
создает внутреннюю наблюдаемую область, которая должна быть объединена с внешней наблюдаемой.Обратите внимание, что и tap
, и subscribe
принимают второй аргумент для функции обработки ошибок.
Подробнее об уведомлениях об ошибках : наблюдаемый контракт определяет три типауведомлений, которые могут быть переданы по цепочке.Одним из них является уведомление error , которое определяется как:
[уведомление об ошибке] указывает, что наблюдаемое завершено с указанным условием ошибки и что оно будет излучатьбольше нет элементов
Ошибки отлова и повторного выброса : если по цепочке наблюдаемых поступает уведомление об ошибке, мы можем грациозно перехватить эту ошибку и преобразовать ее в другое уведомление с помощью catchError
:
$httpSource.pipe(
catchError(err => throwError(new CustomError(err)))
).subscribe(
next => ...,
err => ...
)