"Dostosowywałem moją aplikację na Androida do korzystania z RxJavy, ale mam z tym problem. Jak mi powiedziano w poprzednim poście (Zaczekaj na wszystkie prośby w Android Volley), Używam Observables, aby naśladować, w jaki sposób łączę się z moim API REST w JavaScript. W szczególności, używając biblioteki obietnicy, komponuję takie połączenia:
$q.all([
fetchResourceA(),
fetchResourceB()
])
.then(function (responses) {
...
return fetchResourceC();
})
.then(function (response) {
...
});
W tym przykładzie sprawdzam dwa zasobyjednocześnie zbieraj wyniki, a następnie zbieraj trzeci zasób w oparciu o niektóre parametry z wcześniej zebranych zasobów. Najlepsze, co mogłem zrobić, aby naśladować to w RxJavie, jest tak:
Observable o = Observable.zip(
fetchResourceA(),
fetchResourceB(),
new Func2<ResA, ResB, Object>() {
@Override
public Object call(ResA resA, ResB resB) {
...
}
}
);
Ale staram się je komponować tak, jak robiłemJavaScript. Czy muszę po prostu utworzyć drugą obserwowalną i zasubskrybować ją w wywołaniu zip? To właśnie robię teraz i działa, ale chciałbym wiedzieć, czy istnieje bardziej elegancki i bardziej reaktywny sposób, by uporządkować moje żądania.
Odpowiedzi:
1 dla odpowiedzi № 1The .then
metoda z obietnicy może być transponowana flatMap
metoda w RxJava
To, co możesz zrobić, to zip
następnie flatMap
następnie flatMap
Observable.zip(fetchA(), fetchB(), (a, b) -> new Response(a, b))
.flatMap((responses) -> fetchC())
.flatMap((cResponse) -> /* whatever */)
.subscribe();
Proszę to zanotować fetchA()
, fetchB()
, fetchC()
return Observables.
(Mój przykład użycia lambdas dla jasności)