RxJava 结合布尔运算符

RxJava combine with boolean operators

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

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

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

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

如果第一个 return 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
                }
            }
        });
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;
        }
    });

Resulted Observable 将在 observableDisconnectContact 发出 true 时发出 observableDeleteContact 的结果,如果 false

则过滤(不发出任何东西)
observableDisconnectContact
        .flatMap(isDisconnectSuccessful -> {
            if(isDisconnectSuccessful) return observableDeleteContact;
            else return Observable.just(false);
         })
         .subscribe(isBothActionsSuccessful -> {
             if(isBothActionsSuccessful) {
                 //success!
             } else {
                 //something goes wrong
             }
         });

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

例如:

Completable observableDisconnectContact = ...;
Completable observableDeleteContact = ...;

observableDisconnectContact
    .andThen(observableDeleteContact)
    .subscribe(new CompletableObserver() {
            @Override
            public void onComplete() {
            }

            @Override
            public void onError(Throwable e) {
            }
        });

注意:代码可能无法编译,因为我没有在任何地方对其进行测试。如有错误请修改