【问题标题】:RxJava combine with boolean operatorsRxJava 结合布尔运算符
【发布时间】:2016-11-04 16:34:54
【问题描述】:

我有两个ObservablesobservableDisconnectContact 负责调用 API 请求删除联系人,它工作正常。如果联系人已从数据库中删除,第二个 observableDeleteContact 会发出真或假。我使用greeDao

Observable<Boolean> observableDisconnectContact = apiClient.observableDisconnectContact(contactModel.getId()) 

Observable<Boolean> observableDeleteContact = contactModelRxDao.deleteByKey(contactModel.getDbId())

我想结合两者,但第二个 observable 应该在第一个完成时开始并返回 true。我考虑使用concat()first()。但我必须知道,两个流发出的结果都是正确的。所以我使用combineLatest()zip()。但这不是一个好主意,因为两个流同时运行。我注意到first() 运算符不适用于zip()combineLatest()

如果第一个返回 false 并且两个流的结果应该是一个结果,我如何结合 Observables 在第一个流之后的第二个开始的位置。

Observable.combineLatest(observableDisconnectContact, observableDeleteContact, new Func2<Boolean, Boolean, Boolean>() {
            @Override
            public Boolean call(Boolean isDisconnectSuccess, Boolean isRemoveSuccess) {
                return isDisconnectSuccess && isRemoveFromDatabaseSuccess;
            }
        }).subscribe(new Subscriber<Boolean>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Boolean isDeleted) {
                if (isDeleted) {
                    //TODO
                }
            }
        });

【问题讨论】:

    标签: rx-java reactive-programming rx-android greendao


    【解决方案1】:
    observableDisconnectContact
            .flatMap(isDisconnectSuccessful -> {
                if(isDisconnectSuccessful) return observableDeleteContact;
                else return Observable.just(false);
             })
             .subscribe(isBothActionsSuccessful -> {
                 if(isBothActionsSuccessful) {
                     //success!
                 } else {
                     //something goes wrong
                 }
             });
    

    【讨论】:

      【解决方案2】:
      observableDisconnectContact
          .filter(new Func1<Boolean, Boolean>() {
              @Override
              public Boolean call(Boolean aBoolean) {
                  return aBoolean;
              }
          })
          .flatMap(new Func1<Object, Observable<Boolean>>() {
              @Override
              public Observable<Boolean> call(Object o) {
                  return observableDeleteContact;
              }
          });
      

      如果observableDisconnectContact 发出true,Resulted Observable 将发出observableDeleteContact 的结果,如果是false,则过滤(不发出任何东西)

      【讨论】:

      • 差不多好了。如果observableDisconnectContact 发出假信号,它就被称为onComplited()。是否有可能发出假信号?
      • @Michael 有可能,请检查我的回答
      【解决方案3】:

      我相信使用正确的成功和失败语义会使代码更具可读性。我的意思是使用Completable,它要么在成功时完成,要么在失败时发出错误。

      例如:

      Completable observableDisconnectContact = ...;
      Completable observableDeleteContact = ...;
      
      observableDisconnectContact
          .andThen(observableDeleteContact)
          .subscribe(new CompletableObserver() {
                  @Override
                  public void onComplete() {
                  }
      
                  @Override
                  public void onError(Throwable e) {
                  }
              });
      

      注意:代码可能无法编译,因为我没有在任何地方进行测试。如果发现任何错误,请编辑

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-20
        • 2011-09-27
        • 2011-03-27
        • 1970-01-01
        • 2017-01-09
        相关资源
        最近更新 更多