仅当第一个触发时才组合 2 个 Observable
Combining 2 Observables only if the first one fires
我是 Rx 的新手,我遇到了一种我没有找到任何相关信息的情况(或者我没有问正确的问题)。
我有一个应该触发特定方法的可观察对象。但是,要调用该方法,我需要来自第二个可观察对象的值(顺便说一下,它总是在第一个之前具有该值)。我如何将两者结合起来,以便仅在第一个可观察对象触发时调用该方法?它类似于 combineLatest,但如果任一 Observables 触发,则触发。
布,
丹尼尔
如果我对问题的理解正确,您可以使用 withLatestFrom
运算符,以便组合和后续发射由第一个 observable 门控。
与combine latest列在同一页面:
http://reactivex.io/documentation/operators/combinelatest.html
很简单。一旦第一个 observable 完成,您只需调用另一个 observable,或者如果第二个 observable 依赖于第一个 observable 的连续数据接收,您需要在 onNext() 中调用第二个 observable。
以下代码试图说明可观察代码最终的样子。我还没有检查语法等错误所以使用下面的代码来制定一个想法。
Observable.just(getDataFromServer())
.subscribeWith(new DisposableObserver() {
ArrayList<MyData> dataList = new ArrayList<>();
public void onNext(MyData d) {
// call second observable here if it relies on batches of data the first observable has
dataList.add(d);
}
public void onComplete() {
Observable.from(dataList).map(new Func1<MyData, String>() {
@Override public String call(MyData data) {
// apply your operations etc
}
});
}
});
您可以使用 Flatmap() 来做同样的事情
如果您使用 java 8 那么:
Observable.just(function1()).flatMap( dataFromFirstObservable->
Observable.just(function2(dataFromFirstObservable))
).subscribe(resultFromSecondObservable -> {
//perform action here
});
如果使用 java 7
Observable.just(getData1()).flatMap(new Function<Integer, ObservableSource<?>>() {
@Override
public ObservableSource<?> apply(Integer integer) throws Exception {
return Observable.just(function2(integer));
}
}).subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
//perform action here
}
});
我是 Rx 的新手,我遇到了一种我没有找到任何相关信息的情况(或者我没有问正确的问题)。 我有一个应该触发特定方法的可观察对象。但是,要调用该方法,我需要来自第二个可观察对象的值(顺便说一下,它总是在第一个之前具有该值)。我如何将两者结合起来,以便仅在第一个可观察对象触发时调用该方法?它类似于 combineLatest,但如果任一 Observables 触发,则触发。 布, 丹尼尔
如果我对问题的理解正确,您可以使用 withLatestFrom
运算符,以便组合和后续发射由第一个 observable 门控。
与combine latest列在同一页面: http://reactivex.io/documentation/operators/combinelatest.html
很简单。一旦第一个 observable 完成,您只需调用另一个 observable,或者如果第二个 observable 依赖于第一个 observable 的连续数据接收,您需要在 onNext() 中调用第二个 observable。
以下代码试图说明可观察代码最终的样子。我还没有检查语法等错误所以使用下面的代码来制定一个想法。
Observable.just(getDataFromServer())
.subscribeWith(new DisposableObserver() {
ArrayList<MyData> dataList = new ArrayList<>();
public void onNext(MyData d) {
// call second observable here if it relies on batches of data the first observable has
dataList.add(d);
}
public void onComplete() {
Observable.from(dataList).map(new Func1<MyData, String>() {
@Override public String call(MyData data) {
// apply your operations etc
}
});
}
});
您可以使用 Flatmap() 来做同样的事情 如果您使用 java 8 那么:
Observable.just(function1()).flatMap( dataFromFirstObservable->
Observable.just(function2(dataFromFirstObservable))
).subscribe(resultFromSecondObservable -> {
//perform action here
});
如果使用 java 7
Observable.just(getData1()).flatMap(new Function<Integer, ObservableSource<?>>() {
@Override
public ObservableSource<?> apply(Integer integer) throws Exception {
return Observable.just(function2(integer));
}
}).subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
//perform action here
}
});