捕获错误,但继续迭代列表



我在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()
}

优点是什么?

  1. 你会在最后得到错误(如果有的话(,你可以根据它是什么来决定如何处理它。例如,如果你得到的是NullPointerException而不是IOException,也许你不想做同样的事情
  2. 您可以使用concatMapEagerDelayError的重载版本细化,指定类似maxConcurrency的内容
  3. 您甚至可以使用onErrorResumeNext来映射您的错误,以找出发生错误的项目的ID,或者使用retry/retryWhen来指定重试策略

最新更新