2

首先,我想使用一个简单的计数重试:

  • 重试源可观察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

然后,我想允许用户手动重试。当一个重试通知 observable ( retry$) 发出时,再次重试 observable,之后每次都发出错误。

我尝试使用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). 如果我链接重试运算符,它们会相互触发。

4

1 回答 1

1

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运营商将使其保持“运行”。

于 2018-08-27T20:34:25.043 回答