首先,請原諒我的英語不好異步Web請求的最佳實踐...我會盡力使問題清晰...RxJava:用於編寫有依賴條件
我有一個對象一個最初,使用一個請求b,然後使用b請求ç和d,這些對象之間的關係可以被簡化爲:
|-> c
a -> b -|
|-> d
我寫了這樣的代碼:
B objB;
C objC;
D objD;
Observable.just(a)
.doOnNext((b) -> objB = b)
.map((a) -> getB(a))
.map((b) -> getC(b))
.subscribe((c) -> {
objC = c;
Observable.just(objB)
.map((b) -> getD(b))
.subscribe((d) -> objD = d);
});
我該如何提高呢?
更新
感謝所有爲你的答案。其實,實際情況比較複雜。數據流如下:
|-> e
|-> c -|-> f
a -> b -|-> d
我想要使用的所有對象(b,c,d,e,f)。我將我的代碼更改爲:
class Zip {
B b;
C c;
D d;
E e;
F f;
}
Observable<B> obB = Observable.fromCallable(this::getB).cache();
Observable<C> obC = obB.map(this::getC).cache();
Observable<D> obD = obB.map(this::getD);
Observable<E> obE = obC.map(this::getE);
Observable<F> obF = obC.map(this::getF);
obB
.zipWith(obC, (b, c) -> {
// side effects
Zip zip = new Zip();
zip.b = b;
zip.c = c;
return zip;
})
.zipWith(obD, (zip, d) -> {
// side effects
zip.d = d;
return zip;
})
.zipWith(obE, (zip, e) -> {
// side effects
zip.e = e;
return zip;
})
.zipWith(obF, (zip, f) -> {
// side effects
zip.f = f;
return zip;
})
.subscribe((zip) -> { // update UI... });
這是正確的方法嗎?
不,你是令人困惑的功能轉換與勢在必行的風格和使用可變對象'Zip在流中可能會導致問題。選擇不變性。你應該只用'obE.zipWith(obF,combiner)'來結束。 –