假设我有一个从可迭代对象或数组创建的可观察量。如果我将该可观察量映射到返回某些内容的方法,那么如果我得到一个我不喜欢的值,同时继续处理我收到我喜欢的值的可迭代/数组中的项目,我该如何重试该行为?
这是seudo代码来描绘我在说什么:
Observable
.fromIteratable(values)
.map(value -> getSomeDataFromAnAPI(value))
.retryIf(value -> value != somethingIWant)
.delay(10, TimeUnit.SECONDS);
我正在寻找如何完成"retryIf"行为。
在调用周围放置一个循环并返回所需的值:
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()
将在默认调度程序上尝试每个请求,从而导致许多并行请求。您可以添加参数来限制并行度。