ReactiveX 中的嵌套可观察对象
Nested observable in ReactiveX
我有两个操作:
- 从服务器加载项目(项目只包含某些文件)
- 从本地数据库加载项目(数据库中的项目可能包含其他
文件)
- 将项目合并为一个更新 UI
- 更新数据库中的项目
我知道如何为每个操作使用 rx,但是一旦调用所有操作,我只想到在其他内部嵌套可观察,这将导致回调地狱。
完成这些工作的正确方法是什么?
根据您的描述,服务器和本地数据库查询应该并行进行,在我们拥有这两种数据之后我们将它们合并,因此您需要使用 zip 运算符。
zip 将订阅服务器和本地 DB observable,当两个 Observable 都发出值时,您将继续使用服务器和 DB 数据,然后将它们组合在 zip operator func 中,您将获得发出组合的 Observable数据.
每次发出组合数据 (doOnNext),在后台启动保存操作,并在订阅者中根据组合数据更新 Ui。
Observable<ServerData> getServerData = ...;
Observable<LocalDbData> getLocalDbData = ...;
Observable
.zip(getServerData, getLocalDbData,
(serverData, localDbData) -> combinedData(serverData, localDbData))
.doOnNext(combinedData -> updateDataInDb())
.subscribe(combinedData -> updateUi(combinedData));
我有两个操作:
- 从服务器加载项目(项目只包含某些文件)
- 从本地数据库加载项目(数据库中的项目可能包含其他 文件)
- 将项目合并为一个更新 UI
- 更新数据库中的项目
我知道如何为每个操作使用 rx,但是一旦调用所有操作,我只想到在其他内部嵌套可观察,这将导致回调地狱。
完成这些工作的正确方法是什么?
根据您的描述,服务器和本地数据库查询应该并行进行,在我们拥有这两种数据之后我们将它们合并,因此您需要使用 zip 运算符。 zip 将订阅服务器和本地 DB observable,当两个 Observable 都发出值时,您将继续使用服务器和 DB 数据,然后将它们组合在 zip operator func 中,您将获得发出组合的 Observable数据.
每次发出组合数据 (doOnNext),在后台启动保存操作,并在订阅者中根据组合数据更新 Ui。
Observable<ServerData> getServerData = ...;
Observable<LocalDbData> getLocalDbData = ...;
Observable
.zip(getServerData, getLocalDbData,
(serverData, localDbData) -> combinedData(serverData, localDbData))
.doOnNext(combinedData -> updateDataInDb())
.subscribe(combinedData -> updateUi(combinedData));