rx js время ожидания: отличное guish время истекло из-за ошибки источника - PullRequest
0 голосов
/ 15 января 2020

Используя Rx JS 6.5, я подписываюсь на поток, и я хотел бы предпринять два различных действия: - одно, когда произошла ошибка источника, - другое, когда источник слишком долго отправляет данные (тайм-аут)

Вот то, что у меня в данный момент есть

source$.pipe(
  timeoutWith(5000, log('timeout!')),
  catchError(log('error!'))
).subscribe();

function log(msg) {
  console.log(msg);
  return of(null);
}

Когда мой источник излучает больше 5000 мс, я получаю ожидаемый результат: timeout!

Однако, когда мой источник выдает ошибку раньше ( до 5000 мс) обе строки выполняются. Кажется, что он timeoutWith запускается всякий раз, когда источник не излучал, даже если он ошибался.

Как настроить канал так, чтобы тайм-аут logi c работал только, если время действительно истекло Не потому, что поток был прерван из-за ошибки?

Детская площадка

1 Ответ

1 голос
/ 15 января 2020

Похоже, ваш правильный оператор для использования - timeout вместо timeoutWith, и я объясню.

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

timeout will - Ошибка, если значение не будет выдано до указанной продолжительности , что лучше всего подходит для ваших нужд /

Использование timeout в вашей трубе должно выглядеть следующим образом:

source$.pipe(
  catchError(() => log('func error!')), // will log only when your source throws an error
  timeout(5000),
  catchError(() => log('timeout error!')) // will log only if your source as timed-out for 5000
).subscribe();

StackBlitz DEMO

...