RxJS Observable:使用count重试,然后使用notifier

RxJS Observable:使用count重试,然后使用notifier,rxjs,observable,retrywhen,Rxjs,Observable,Retrywhen,首先,我想使用一个简单的计数重试: 重试源可观察n次 然后,发出错误 (最好在每次重试后立即发出错误,但是retry(count)似乎不这样做。) 如果我理解正确,这是重试(计数)的行为: 然后,我希望允许用户手动重试。当重试通知程序observable(retry$)发出时,再次重试该observable,随后每次都会发出错误 我尝试使用retryWhen进行此操作,但是当重试时,不会发出错误 我想重试,但也会发出任何错误,以便在重试运行时在用户界面中显示这些错误 { const re

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

  • 重试源可观察
    n次
  • 然后,发出错误
(最好在每次重试后立即发出错误,但是
retry(count)
似乎不这样做。)

如果我理解正确,这是
重试(计数)
的行为:

然后,我希望允许用户手动重试。当重试通知程序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

此外,我不知道如何将此与
重试(计数)
结合起来。如果我链接重试操作符,则会相互触发。

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();
const retrySubject=new Rx.Subject();
const retry$=retrySubject.asObservable();
新接收。可观察(观察者=>{
控制台日志(“订阅”);
观察者错误(“错误”);
})
.retryWhen(错误=>Rx.Observable.merge(
错误
.do(错误=>console.log(错误))//日志错误
.filter((错误,索引)=>索引<3),//只取前3个,忽略其余的
重试$//同时使用用户请求重试
))
.subscribe();
retrySubject.next();

您可以使用
take(3)
而不是
filter
,但这将停止
errors
流,因此错误记录也将停止<代码>过滤器
操作符将保持其“运行”。

我希望可观察对象作为流的一部分发出错误,而不是作为单独的副作用记录。这是不可能的,当可观察对象发出错误时,不再发出元素,它的行为就好像可观察对象已完成,但有错误。啊,有趣。我没有意识到这一点。由于我所要求的在技术上是不可能的,我会把你的答案标记为正确的。
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();