我有一个observable发射值。基于这些值,我需要订阅/取消订阅另一个Observable。订阅基于其他排放
有没有一个方便的方法呢?一种方便的方式,而不是创建一个领域的订阅和手动处理它?
示例: Observable A
发出Boolean
s。如果它发出true
,则应订阅Observable B
- 如果false
此订阅应取消订阅。
我有一个observable发射值。基于这些值,我需要订阅/取消订阅另一个Observable。订阅基于其他排放
有没有一个方便的方法呢?一种方便的方式,而不是创建一个领域的订阅和手动处理它?
示例: Observable A
发出Boolean
s。如果它发出true
,则应订阅Observable B
- 如果false
此订阅应取消订阅。
我不确定我们是否在同一页上100%,但我认为你错过了一点。也许你会觉得我很挑剔,但我认为这将是很好的让我们的条款直。
Observable
当Subscriber
向其订购时开始发射值。因此,除非您考虑两个单独的Subscribers
,否则您无法对订阅发出的值作出反应,因为Observer
不会发出任何内容。
也就是说......是什么(我觉得)你想做的事可以做到这样:
Observable<Boolean> observableA = /* observable A initialization */;
final Observable<SomeObject> observableB = /* observable B initialization */;
observableA
.flatMap(new Func1<Boolean, Observable<SomeObject>>() {
@Override
public Observable<SomeObject> call(Boolean aBoolean) {
if (!aBoolean) {
throw new IllegalStateException("A dummy exception that is here just to cause the subscription to finish with error.");
}
return observableB;
}
})
.subscribe(
new Action1<SomeObject>() {
@Override
public void call(SomeObject someObject) {
// THIS IS A PART OF THE SUBSCRIBER TO OBSERVABLE B.
// THIS METHOD WILL BE CALLED ONLY IF THE OBSERVABLE A RETURNED TRUE
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
// A dummy Action1 so the subscription does not crash on the Exception
}
});
如果所有的观测值具有相同类型或可以结合基于价值任何你想要的。
Observable.from(new int[]{1,2,3,4,5})
.filter(i -> i < 5) // filter out something
.flatMap(i -> {
if (i < 2) { // subscribe on some observable, based on item value
return Observable.just(i);
} else {
return Observable.just(3);
}
})
也许我在想的解决方案不存在。是的,我正在考虑两个订阅。即使我更喜欢只有一个字段的订阅和存储订阅/取消订阅它,而不是使用隐式的onError取消订阅。 –