kotlin - 将 flatMap 与 Completable 一起使用
问题描述
我正在尝试多次调用 API,并传入不同的参数。当没有更多数据返回时,rx 流应该终止。每次调用后,数据都会存储在我的本地存储库中。这是我所拥有的:
val startPositions = BehaviorSubject.createDefault(0)
startPositions.flatMap { startPos -> App.context.repository.getConnections(startPos) }
.flatMap { connections -> App.context.repository.storeConnections(connections) }
.doOnNext { startPos -> startPositions.onNext(startPos + 1) }
.subscribe({ startPos -> println("Index $startPos") })
这是处理下载数据的api方法:
override fun getConnections(startPos: Int): Observable<List<Connection>> {
return myAPI.getConnections(startPos)
}
这是存储数据的api方法:
override fun storeConnections(connections: List<Connection>): Completable =
Completable.fromAction {
appDao.storeConnections(connections.map {
mapper.toDb(it)
})
}
我得到的编译错误是:
类型不匹配:推断类型是 (List) -> Completable 但是 ((List) -> ObservableSource!)!预计
如果可能,我不想更改我的 api 调用的返回类型。我也不确定是否使用 flatMap。下载返回的数据是一个列表,我希望该列表在流中保留为列表。我不想发出单个列表项。
解决方案
为了修复类型不匹配错误,请使用 operatorflatMapCompletable
而不是flatMap
:
.flatMapCompletable { connections -> App.context.repository.storeConnections(connections) }
然后你将不得不使用doOnComplete
而不是doOnNext
:
.doOnComplete { startPos -> startPositions.onNext(startPos + 1) }
推荐阅读
- javascript - 未捕获的 ReferenceError:在 HTMLAnchorElement.onclick 中未定义 onSelect (VM852 :14)
- java - vpn开启时代理服务器工作吗?
- c# - 发生无效服务器实例异常:没有安装节点!请通过 NPM 安装 node 或下载并安装 Appium
- vb.net - 按字母顺序对目录路径进行排序
- python-3.x - python selenium的wait.to_be_clickable()方法不能立即点击
- javascript - 采取行动时,Express POST 路线未打开
- java - 如果用户登录,Log4j2 添加到布局
- ansible - 基于组名的ansible复制文件
- python - 修改 ROI,然后使用 python 将其添加到原始图像中
- python - 当列接收相同的值时 panada.crosstab 不创建方表