rx-java - fromIterable 之后如何保证订阅的顺序?
问题描述
这是一个简化的示例,但基本上可以归结为
Observable.just(listOfItems)
.flatMapIterable { it }
.flatMap {
doWhatever()
.subscribeOn(Schedulers.io())
}
我观察到并猜想这是有道理的,虽然 iterable 是按顺序 onNext 的,但它doWhatever()
是按随机顺序订阅的。
有没有办法可以保证 doWhatever 订阅的顺序?我不想要 concatMap,而 concatMapEager 似乎只是订购结果,而不是订阅。基于索引的人为延迟?(似乎只有更高的延迟才可靠,无论如何都是神奇的数字 - 不好)
///
private val uploadSchedules = Schedulers.from(Executors.newFixedThreadPool(5))
fun upload(request: Request) : Completable {
Observable.just(request)
.flatMap { request -> upload(request).subscribeOn(uploadScheduler) }
}
fun upload(requests: List<Request>) : Completable {
Observable.fromIterable(requests)
// here the subscriptions order are race-y, I want to want them ordered by the order of the list--|
.flatMap { request -> upload(request) |
.subscribeOn(uploadScheduler) |
.doOnSubscribe { log(request) } <-------------------------------------------------|
}
}
// log outputs:
// request 0
// request 3
// request 4
// request 2
// request 1
// etc, race-y, random order
解决方案
推荐阅读
- soap - 在 WSO2 ESB 中调用代理服务时找不到操作的端点引用 (EPR)
- excel - 在excel单元格中定义数组并在excel数组公式中使用该单元格
- python - 将下一行附加到上一行
- nginx - 入口控制器不处理流量
- python - 数据框列的正则表达式
- java - 如何将 offsetTime 添加到 UTC 时间以获得正确的 ZonedDateTime?
- java - 如何在 build.bnd 中定义可选分辨率的通用导入包
- monitoring - Prometheus EKS 集群监控
- python - 我想通过在 python 中传递元组列表来创建图像
- google-apps-script - 如何通过 Google App Script 从 Google Cloud Storage 获取上传的文件 URL