我有一個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取消訂閱。 –