Typescript - изменить значения массива при деструктуризации - PullRequest
0 голосов
/ 17 декабря 2018

Скажите, у меня есть этот кусок кода:

const [val$, err$] = partition(result => ...)(httpSource$)
const valid$ = val$.pipe(
    tap(() => ...),
    map(result => ...)
)
const error$ = err$.pipe(
    tap(() => ...),
    map(result => ...)
)

Можно ли избежать создания переменных val$ и err$, изменив возвращаемое значение partition перед присваиванием?

1 Ответ

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

Обычно нет необходимости разбивать 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 => ...
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...