RxJava 结合布尔运算符

Mic*_*ael 3 reactive-programming greendao rx-java rx-android

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

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

Observable<Boolean> observableDeleteContact = contactModelRxDao.deleteByKey(contactModel.getDbId())
Run Code Online (Sandbox Code Playgroud)

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

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

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
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)

Mak*_*dov 6

observableDisconnectContact
        .flatMap(isDisconnectSuccessful -> {
            if(isDisconnectSuccessful) return observableDeleteContact;
            else return Observable.just(false);
         })
         .subscribe(isBothActionsSuccessful -> {
             if(isBothActionsSuccessful) {
                 //success!
             } else {
                 //something goes wrong
             }
         });
Run Code Online (Sandbox Code Playgroud)