昨天找了一天没找到合适的操作符.写了一个扩展方法. 具体情况: 需要请求一批url大概1000个左右 服务器限制不能并行请求,不能请求过快. 所以想要做的就是等到上一个请求完成后再开始下一个请求
扩展方法
fun <T, R> Observable<List<T>>.lazyFromIterable(mapper: (T) -> Observable<R>): Observable<Observable<R>> {
return flatMap { list ->
Observable.create<Observable<R>> { emitter ->
fun emi(index: Int) {
if (list.size > index) {
emitter.onNext(mapper(list[index]).doOnComplete {
emi(index + 1)
})
} else {
emitter.onComplete()
}
}
emi(0)
}
}
}
fun <T> ObservableSource<out ObservableSource<out T>>.concat(): Observable<T> {
return Observable.concat(this)
}
使用
fun cachedBookChapter(bookUrl: String): Flowable<Pair<Int, Int>> {
return localSource.getUnLoadChapters(bookUrl).map { cs -> cs.mapIndexed { index, chapter -> index to cs.size to chapter } }.lazyFromIterable {
loadChapter(it.second).map { _ -> it.first }
}.concat().toFlowable(BackpressureStrategy.LATEST)
}