【问题标题】:How to limit retryWhen count如何限制重试次数
【发布时间】:2019-02-25 10:23:06
【问题描述】:

我在 retryWhen 中使用 PublishSubject 来允许用户重试操作,类似于this answer。一切正常,但有一个问题 - 用户点击重试 3 次后,我不应该再允许重试,应该中止操作。有没有办法将重试限制为 3 次? 我尝试过 publishSubject.take(3) 运算符,但没有成功。

【问题讨论】:

  • 请提供您使用的retryWhen 设置。正如我之前提到的,你不能通过给它一个空源来阻止flatMap
  • 我仍然没有 retryWhen 设置可以按我希望的那样工作,如果我愿意,那么不会有人问我,我仍在尝试找到适合我的设置要求...
  • “我在 retryWhen 中使用了 PublishSubject”。那么你有没有代码?
  • 正如我提到的,我有一个与answer 相同的测试设置,但它并不完全符合我的要求。
  • 那么是什么阻止您对从retryWhen 中返回的序列应用take(3)

标签: rx-java rx-java2 rx-android reactivex


【解决方案1】:

运算符(例如retryWhen)有一个次要流程,其结果会影响主要流程。因此,也可以对这个二级流执行流操作,因此您可以应用各种运算符来塑造其结果:

改编这个:https://stackoverflow.com/a/47677308/61158

final PublishSubject<Object> retrySubject = PublishSubject.create();

disposable.add(
    getData()
    .doOnError(throwable -> enableButton())
    .retryWhen(observable -> 
        observable.zipWith(retrySubject, 
             (o, o2) -> o
        )
        .take(3)  // <------------------------ maximum 3 items from the secondary sequence
        .concatWith(Observable.error(new RetriesExhaustedException()));
     )
    .subscribeWith(/* do what you want with the result*/)
);

【讨论】:

  • 最后一个问题,在这种情况下,从 PublishSubject 更改为 SingleSubject 会影响 take(3) 操作吗?我想减少陷阱并只允许发射 onNext() 或 onError()
  • 请想一想SingleSubject代表什么。
  • 这意味着它只会发出1个值或错误,所以我想我会在errorObservable的平面图中创建一个新的。但是很难测试它是否会破坏 take(3) 操作。
  • 这毫无意义。什么会在那些不同的SingleSubjects 上调用onSuccess/onError
  • 我通过接口方法将它传递给错误处理程序 - void onConnectionFailed(SingleSubject retrySubject);。错误处理程序可以选择调用 retrySubject.onError() 并中止重试或调用 retrySubject.onSuccess() 重试
【解决方案2】:

与其使用retry或者retryWhen,不如试试这个基于errors catch操作的方案

let count = 0;
let retry_limit = 2;
from([1])
  .pipe(
    catchError((err, obs) => {
       if (count >= retry_limit) {
         return throwError(err)
       }
       count++
       return obs.pipe(delay(500))
  })
);

【讨论】:

    猜你喜欢
    • 2012-05-20
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2017-02-04
    • 1970-01-01
    相关资源
    最近更新 更多