【问题标题】:RxJS Observable: retry using count and then using notifierRxJS Observable:使用计数重试,然后使用通知程序
【发布时间】:2018-08-27 17:24:47
【问题描述】:

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

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

【问题讨论】:

    标签: rxjs observable retrywhen


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

    【讨论】:

    • 我希望 observable 将错误作为流的一部分发出,而不是作为单独的副作用记录。
    • 这是不可能的,当 observable 发出错误时不再发出任何元素,就好像 observable 已完成但有错误。
    • 啊,有趣。我没有意识到这一点。由于我的要求在技术上是不可能的,所以我会将您的答案标记为正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多