说我有一个从迭代器或数组创建的Observable。如果我将可观察值映射到返回某些内容的方法,那么如果我得到了一个我不喜欢的值,同时又继续处理我收到了我喜欢的值的iterable / array中的项,那么该如何重试该行为?
以下是伪代码来描述我在说什么:
Observable
.fromIteratable(values)
.map(value -> getSomeDataFromAnAPI(value))
.retryIf(value -> value != somethingIWant)
.delay(10, TimeUnit.SECONDS);
我正在寻找如何完成“ retryIf”行为。
答案 0 :(得分:0)
在调用周围放置一个循环并返回所需的值:
Observable
.fromIteratable(values)
.map(value -> {
while (true) {
Data d = getSomeDataFromAnAPI(value));
if (d == somethingIWant) {
return d;
}
}
}
.delay(10, TimeUnit.SECONDS);
答案 1 :(得分:0)
如果您不喜欢发射的值,则可以通过将其映射到错误,然后使用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()
将在默认调度程序上尝试每个请求,从而导致许多并行请求。您可以添加参数来限制并行度。