Refactoring 如何组合两个几乎相似的RxJava方法?
我有两种RxJava风格的方法:Refactoring 如何组合两个几乎相似的RxJava方法?,refactoring,rx-java,rx-android,Refactoring,Rx Java,Rx Android,我有两种RxJava风格的方法: void requestFirst() { Observable .combineLatest( api.requestAPI1(), api.requestAPI2(), (result1, result2) -> result1) .map(result -> processResult(result)) .observ
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));
}
除CombineTest外,这两种方法几乎相同,
我想合并它进行重构。
因此,我编写了以下代码:
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));
}
但我认为CombineTest方法的第二个参数不是Rx的风格。
如何按照Rx的风格合并这两种类似的方法?
谢谢。您可以添加一个新方法:
void processResults(Observable<Source> dataSource) {
results.map(result -> processResult(result))
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(etc1())
.doOnSubscribe(etc2())
.subscribe(
result -> onComplete(result),
e -> onError(e));
}
使用运算符.merge()
您可以在
合并后添加.distinctUntilChange()
,以避免重复处理api.requestAPI1()
结果。奇怪的解决方案!首先:它看起来不符合“Rx模式”。次要:在这种情况下,如何处理订阅、需要时取消订阅等。?
void requestNext() {
processResults(api.requestAPI1());
}
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));
}