RxJS Observable: повторите попытку с использованием count, а затем с помощью уведомителя - PullRequest
0 голосов
/ 27 августа 2018

Во-первых, я хотел бы повторить попытку, используя простой счет:

  • Повторить источник, наблюдаемый n раз.
  • Затем выдать ошибку.

(Предпочтительно, ошибка может выдаваться сразу после каждой попытки, но retry(count), похоже, этого не делает.)

Если я правильно понимаю, это поведение retry(count):

{
  new Rx.Observable(observer => {
    console.log("subscribe");
    observer.error("ERROR");
  })
    .retry(3)
    .subscribe({
      error: console.log
    });
}
// subscribe
// subscribe
// subscribe
// subscribe
// ERROR

Затем я хотел бы разрешить пользователю повторить попытку вручную. Когда отправляется наблюдаемое уведомление о повторных попытках (retry$), повторите попытку наблюдаемой снова, выдавая ошибку каждый раз после этого.

Я пытался использовать retryWhen для этого, однако, хотя повторные попытки все же происходят, ошибка никогда не выдается.

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

{
  const retrySubject = new Rx.Subject();
  const retry$ = retrySubject.asObservable();
  new Rx.Observable(observer => {
    console.log("subscribe");
    observer.error("ERROR");
  })
    .retryWhen(() => retry$)
    .subscribe({
      error: console.log
    });
  retrySubject.next();
}
// subscribe
// subscribe

Кроме того, я не уверен, как объединить это с retry(count). Если я соединю операторы повтора, они будут вызывать друг друга.

1 Ответ

0 голосов
/ 27 августа 2018

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

const retrySubject = new Rx.Subject();
const retry$ = retrySubject.asObservable();
new Rx.Observable(observer => {
  console.log("subscribe");
  observer.error("ERROR");
})
  .retryWhen(errors => Rx.Observable.merge(
    errors
      .do(error => console.log(error)) // log error
      .filter((error, index) => index < 3), // take only first 3 and ignore the rest
    retry$ // also retry with user request
  ))
  .subscribe();

retrySubject.next();

Вы можете использовать take(3) вместо filter, но это остановит поток errors, так что регистрация ошибок также будет остановлена. filter оператор продолжит работу.

...