Как я могу узнать, завершился ли Observable с ошибкой или без ошибки? - PullRequest
0 голосов
/ 18 мая 2018

Мне нужно выполнить некоторый код, когда Observable будет завершен в зависимости от того, завершился ли он с ошибкой или без.У меня есть этот код:

const obs = getMyObservable().pipe(finalize(() => {
    //here
}));

Как видите, я использую оператор finalize, но я не могу знать, завершился ли он с ошибкой или без нее.Есть ли какие-нибудь операторы doOnComplete или doOnError в rxjs?

Ответы [ 2 ]

0 голосов
/ 16 июля 2019

Вы можете использовать concat

concat(
 yourObservable(),
 defer(() => {
  // do something on success
  return of('success');
 })
)

в соответствии с документацией , вторая наблюдаемая будет подписана, только если первая успешно завершена

0 голосов
/ 27 июня 2018

Согласно https://www.learnrxjs.io/

С последней версией RXJS вы можете использовать эти 3 оператора

const obs = getMyObservable().pipe(                                       // Let's assume 'obs' returns an array
    tap(() => console.log('Action performed before any other')),
    catchError(() => { console.error('Error emitted'); return of([]); }), // We return [] instead
    finalize(() => console.log('Action to be executed always'))           // Either Error or Success
);
obs.subscribe(data => console.log(data));  // After everything, we log the output.

Надеюсь, это поможет

РЕДАКТИРОВАТЬ на основе комментария JoniJnm

Точнее говоря, есть 3 основных трубы:

  1. Трубы, которые изменяют результат перед подпиской.
  2. Трубы, которые не изменяютсярезультат перед подпиской.
  3. Special Pipes.

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

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

Finalise - это специальный канал, он делает то же, что и Tap, но после подписки,это хорошо, например, чтобы зарегистрировать окончательные результаты или отменить подписку после ее завершенияs.

CatchError - это канал, который изменяет результат, но вызывается только в том случае, если предыдущий шаг выдал ошибку.Это используется, чтобы избежать необработанной ошибки, и вы должны вернуть наблюдаемое «по умолчанию» вместо сбойной наблюдаемой (поэтому мы обрабатываем ошибку, и приложение не ломается).

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

Если этот канал не запущен, результат считается без ошибок.

...