Как отсрочить throwError с помощью RxJS? - PullRequest
1 голос
/ 22 мая 2019

Как и ожидалось, следующий код выдает 42 через 5 секунд:

const valueObservable = of(42).pipe(delay(5000));
valueObservable.subscribe((value) => console.log(value));

Тем не менее, эта версия сбрасывает ошибки сразу при подписке:

const throwingObservable = throwError(new Error('My Error')).pipe(delay(5000));
throwingObservable.subscribe((value) => console.log(value), (error) => console.error(error));

Почему это происходит?Как мне отложить ошибку?

1 Ответ

2 голосов
/ 22 мая 2019

Ошибка Rxjs является исключением, она немедленно останавливает поток и позволяет вам перехватить его, чтобы он реагировал на что-то непредвиденное.Я полагаю, у вас нет никакого способа манипулировать потоком throwError, кроме как с помощью catchError

Решение 1. Управляйте потоком перед выдачей ошибки.

const throwingObservable = throwError(new Error('My Error'));
timer(5000).pipe(mergeMap(e => throwingObservable))
  .subscribe((value) => console.log(value), (error) => console.error(error));

Решение2: Перехватите ошибку, задержите поток, затем отправьте его снова

throwingObservable.pipe(
  // We catch the error, we delay by adding timer stream, then we mergeMap to the error.
  catchError(e => timer(1000).pipe(mergeMap(t => throwError(e)))
)).subscribe(console.log, console.error);

Вы можете увидеть это в действии

...