RxJava:读取多个订阅并根据它们的结果执行操作?
RxJava: Reading multiple subscriptions and performing an action based on their results?
我有一个网络调用依赖于多个 UI 元素的输入。它基本上是一个交易界面,用户可以在其中选择金额、货币和目的地等内容。在请求被触发之前,我需要验证一切(例如,用户的余额是否有金额,目的地是否有效等)。我有 Observable
用于所有这些网络调用,但我不确定同时启动所有这些调用并使用它们的结果来确定要采取的操作的最佳方法是什么。
基本上,理想的流程是每个条件都有一个失败案例(我可以在代码中为每个案例确定),如果满足任何这些失败案例,则向用户显示错误,说明哪些输入是无效的。如果所有检查都通过,则启动交易。
我该怎么办?
如果我没理解错的话,你的 Observables 的签名类似于:
// verifier Observables which perform network calls
Observable<Verification1> test1 = ...
Observable<Verification2> test2 = ...
...
// Observable to fire the transaction
Observable<TransactionResult> fireTransaction = ...
// represents the clicks on the "go" button of the UI
Observable<Void> goButtonClicks = ...
然后你可以按如下方式组合所有这些 Observables:
goButtonClicks.flatMap(theVoid -> {
return Observable.zip(
test1.subscribeOn(Schedulers.io()),
test2.subscribeOn(Schedulers.io()),
(v1, v2) -> {
if (v1 and v2 pass all your requirements) {
return fireTransaction;
} else {
return Observable.just(new TransactionFailure("error"));
}
}
);
}).subscribe(transactionResult -> {
UI.showMessage(transactionResult.getMessage());
})
.subscribeOn(Schedulers.io())
调用为您提供验证网络调用的并行性,zip
允许您对所有结果进行 "wait"。
但是,我想在服务器端,出于安全原因,您将不得不再次进行所有这些测试。因此,如果您可以更改架构,您可能希望始终 "fire" UI 中的事务,让服务器进行检查,并 return 向 success/failure 通知UI.
我有一个网络调用依赖于多个 UI 元素的输入。它基本上是一个交易界面,用户可以在其中选择金额、货币和目的地等内容。在请求被触发之前,我需要验证一切(例如,用户的余额是否有金额,目的地是否有效等)。我有 Observable
用于所有这些网络调用,但我不确定同时启动所有这些调用并使用它们的结果来确定要采取的操作的最佳方法是什么。
基本上,理想的流程是每个条件都有一个失败案例(我可以在代码中为每个案例确定),如果满足任何这些失败案例,则向用户显示错误,说明哪些输入是无效的。如果所有检查都通过,则启动交易。
我该怎么办?
如果我没理解错的话,你的 Observables 的签名类似于:
// verifier Observables which perform network calls
Observable<Verification1> test1 = ...
Observable<Verification2> test2 = ...
...
// Observable to fire the transaction
Observable<TransactionResult> fireTransaction = ...
// represents the clicks on the "go" button of the UI
Observable<Void> goButtonClicks = ...
然后你可以按如下方式组合所有这些 Observables:
goButtonClicks.flatMap(theVoid -> {
return Observable.zip(
test1.subscribeOn(Schedulers.io()),
test2.subscribeOn(Schedulers.io()),
(v1, v2) -> {
if (v1 and v2 pass all your requirements) {
return fireTransaction;
} else {
return Observable.just(new TransactionFailure("error"));
}
}
);
}).subscribe(transactionResult -> {
UI.showMessage(transactionResult.getMessage());
})
.subscribeOn(Schedulers.io())
调用为您提供验证网络调用的并行性,zip
允许您对所有结果进行 "wait"。
但是,我想在服务器端,出于安全原因,您将不得不再次进行所有这些测试。因此,如果您可以更改架构,您可能希望始终 "fire" UI 中的事务,让服务器进行检查,并 return 向 success/failure 通知UI.