java - RxJava : Reading multiple subscriptions and performing an action based on their results?

标签 java android rx-java

我有一个网络调用,该调用取决于多个 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 允许您“等待”所有结果。

但是,我想在服务器端,出于安全原因,您必须再次进行所有这些测试。因此,如果您可以更改架构,您可能希望始终在 UI 中“触发”事务,让服务器进行检查,并向 UI 返回成功/失败通知。

关于java - RxJava : Reading multiple subscriptions and performing an action based on their results?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29991876/

相关文章:

java - 使用 c :out tag 访问 session 中 1 个 java bean 的属性

java - 通配符转义 JPA 规范

java - 使用带引号从java读取csv文件,但我想要不带引号

android - 定义位图字节数并设置位图缓冲区的限制

android - Rxjava - 逻辑隔离

java - 从数据框中的列中删除特殊字符

android - 明智地获取所有联系人时间戳

Android 通知恢复 Activity

android - 如何进行两次 Retrofit 调用并合并结果?

rx-java - 为什么 rxjava Observable.subscribe(observer) 返回 void?