Mic*_*ael 3 reactive-programming greendao rx-java rx-android
我有两个Observables。observableDisconnectContact负责调用 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)
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)