我在Kotlin中有一个函数正在执行此操作:
fun getItemByIds(ids: List<Long>): Single<List<Item>> {
return Flowable.fromIterable(ids)
.flatMapSingle { getItem(it) }
.toList()
}
这工作得很好,但在getItem生成错误(如http错误404(的情况下,代码不会继续迭代。
getItem返回一个Single<>
,但在http错误的情况下,我返回Single.error(it)
。
我想做的是确保列表仍在构建中,如果出现错误,我只是忽略错误,并使用生成错误的项目构建列表。
知道吗?
有一个Rx操作符可以解决您的问题:
fun getItemByIds(ids: List<Long>): Single<List<Item>> {
return Flowable.fromIterable(ids)
.concatMapEagerDelayError({ id -> getItem(id).toFlowable() }, true).toList()
}
优点是什么?
- 你会在最后得到错误(如果有的话(,你可以根据它是什么来决定如何处理它。例如,如果你得到的是
NullPointerException
而不是IOException
,也许你不想做同样的事情 - 您可以使用
concatMapEagerDelayError
的重载版本细化,指定类似maxConcurrency
的内容 - 您甚至可以使用
onErrorResumeNext
来映射您的错误,以找出发生错误的项目的ID,或者使用retry
/retryWhen
来指定重试策略