我有两种RxJava风格的方法:
void requestFirst() {
Observable
.combineLatest(
api.requestAPI1(),
api.requestAPI2(),
(result1, result2) -> result1)
.map(result -> processResult(result))
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(etc1())
.doOnSubscribe(etc2())
.subscribe(
result -> onComplete(result),
e -> onError(e));
}
void requestNext() {
api.requestAPI1()
.map(result -> processResult(result))
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(etc1())
.doOnSubscribe(etc2())
.subscribe(
result -> onComplete(result),
e -> onError(e));
}
除了combineLatest之外,两种方法几乎相同, 我想合并它进行重构。 所以我写下面的代码:
void request(boolean isFirst) {
Observable
.combineLatest(
api.requestAPI1(),
(isFirst) ? api.requestAPI2() : Observable.empty(),
(result1, result2) -> result1)
.map(result -> processResult(result))
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(etc1())
.doOnSubscribe(etc2())
.subscribe(
result -> onComplete(result),
e -> onError(e));
}
但我认为combineLatest方法的第二个参数不是Rx的风格。 如何通过Rx的风格合并这两种类似的方法? 谢谢。
答案 0 :(得分:1)
使用operator .merge()
final Observable tworequestsObservable = Observable
.combineLatest(
api.requestAPI1(),
api.requestAPI2(),
(result1, result2) -> result1)
void requestNext() {
Observable.merge(api.requestAPI1(), tworequestsObservable)
.map(result -> processResult(result))
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(etc1())
.doOnSubscribe(etc2())
.subscribe(
result -> onComplete(result),
e -> onError(e));
}
您可以在.distinctUntilChange()
之后添加merge
,以避免双重处理api.requestAPI1()
结果。
答案 1 :(得分:0)
您可以添加新方法:
void processResults(Observable<Source> dataSource) {
results.map(result -> processResult(result))
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(etc1())
.doOnSubscribe(etc2())
.subscribe(
result -> onComplete(result),
e -> onError(e));
}
并将其用作:
void requestNext() {
processResults(api.requestAPI1());
}