Rx java 如何在RxJava可观察对象中重复一个但继续其他
假设我有一个从一个可数或数组中创建的可观察对象。如果我将该可观察值映射到一个返回某个值的方法,那么如果我得到了一个不喜欢的值,同时又继续处理iterable/数组中我收到了一个喜欢的值的项,我如何重试该行为 下面是seudo代码来描述我所说的内容:Rx java 如何在RxJava可观察对象中重复一个但继续其他,rx-java,rx-java2,reactivex,Rx Java,Rx Java2,Reactivex,假设我有一个从一个可数或数组中创建的可观察对象。如果我将该可观察值映射到一个返回某个值的方法,那么如果我得到了一个不喜欢的值,同时又继续处理iterable/数组中我收到了一个喜欢的值的项,我如何重试该行为 下面是seudo代码来描述我所说的内容: Observable .fromIteratable(values) .map(value -> getSomeDataFromAnAPI(value)) .retryIf(value -> value != somethin
Observable
.fromIteratable(values)
.map(value -> getSomeDataFromAnAPI(value))
.retryIf(value -> value != somethingIWant)
.delay(10, TimeUnit.SECONDS);
我正在寻找如何完成“重试”行为。围绕调用进行循环,并返回所需的值:
Observable
.fromIteratable(values)
.map(value -> {
while (true) {
Data d = getSomeDataFromAnAPI(value));
if (d == somethingIWant) {
return d;
}
}
}
.delay(10, TimeUnit.SECONDS);
如果您不喜欢发出的值,可以通过将其映射到错误,然后使用
retryWhen()
操作符重试来拒绝它(强制!)
Observable
.fromIterable( values )
.flatMap( value -> getSomeDataFromAnAPI( value )
.doOnNext( value -> {
if ( value != somethingIWant ) {
throw new IllegalStateException("undesired");
}
})
.retryWhen( throwable -> throwable.delay( 10, TimeUnit.SECONDS) );
这将重试返回错误值的项,直到返回正确值为止
请注意,
flatMap()
将在默认计划程序上尝试每个请求,从而导致大量并行请求。您可以添加一个参数来限制并行性。取决于代码的功能。如果您有阻塞或长时间运行的代码,您需要一种停止代码的方法。