假设我需要从远程服务请求报告。 根据其API,我需要分三步完成: 1.提交报告收集请求(作为回复,我得到reportId)。 2.检查报告状态,直到它完成“延迟”(例如10秒)。 3.最后通过id获取报告。
所以,问题是:有没有办法使用RxJava API检查谓词函数,直到它返回true并有一些延迟?
我能找到的最合适的运算符是'takeUntil',代码是这样的:
Observable.just(request)
.map(this::submitAndGetId)
.takeUntil(this::reportIsDone)
.map(this::getReport)
但我找不到指定状态检查之间延迟的方法
答案 0 :(得分:3)
使用flatMap
和interval
:
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);