我有两个Observables
。 observableDisconnectContact
负责调用删除联系人的API请求,它可以正常运行。如果从数据库中删除了联系人,则第二个observableDeleteContact
会发出true或false。我使用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
}
}
});
答案 0 :(得分:4)
observableDisconnectContact
.flatMap(isDisconnectSuccessful -> {
if(isDisconnectSuccessful) return observableDeleteContact;
else return Observable.just(false);
})
.subscribe(isBothActionsSuccessful -> {
if(isBothActionsSuccessful) {
//success!
} else {
//something goes wrong
}
});
答案 1 :(得分:1)
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;
}
});
如果observableDeleteContact
发出observableDisconnectContact
并且过滤(不发出任何内容)true
false
的结果
答案 2 :(得分:0)
我相信,使用成功和失败的正确语义将使代码更具可读性。我的意思是说使用Completable
要么成功完成,要么失败失败。
例如:
Completable observableDisconnectContact = ...;
Completable observableDeleteContact = ...;
observableDisconnectContact
.andThen(observableDeleteContact)
.subscribe(new CompletableObserver() {
@Override
public void onComplete() {
}
@Override
public void onError(Throwable e) {
}
});
注意:由于我没有在任何地方进行测试,因此代码可能无法编译。如果发现任何错误,请进行编辑