延迟

时间:2018-05-19 17:23:11

标签: java rx-java rx-java2

假设我需要从远程服务请求报告。 根据其API,我需要分三步完成: 1.提交报告收集请求(作为回复,我得到reportId)。 2.检查报告状态,直到它完成“延迟”(例如10秒)。 3.最后通过id获取报告。

所以,问题是:有没有办法使用RxJava API检查谓词函数,直到它返回true并有一些延迟?

我能找到的最合适的运算符是'takeUntil',代码是这样的:

Observable.just(request)
            .map(this::submitAndGetId)
            .takeUntil(this::reportIsDone)
            .map(this::getReport)

但我找不到指定状态检查之间延迟的方法

1 个答案:

答案 0 :(得分:3)

使用flatMapinterval

Observable
  .just(request)
  .map(this::submitAndGetId)
  .flatMap(id -> 
    Observable
        .interval(1, TimeUnit.SECONDS)
        .filter(n -> reportIsDone(id))
        .map(n -> id)
        .first()
  )
  .map(this::getReport);

对于重试的上限指数退避:

Observable<Long> retries = 
  Observable
    .just(1, 2, 4, 8, 16)
    .concatWith(Observable.just(30).repeat())
    .flatMap(n -> Observable.timer(n, TimeUnit.SECONDS));

Observable
  .just(request)
  .map(this::submitAndGetId)
  .flatMap(id -> 
     retries
        .filter(n -> reportIsDone(id))
        .map(n -> id)
        .first()
  )
  .map(this::getReport);