Eu tenho adaptado meu aplicativo Android para usar o RxJava, mas estou tendo um pouco de dificuldade em fazê-lo. Como eu tinha sido aconselhado em um post anterior (Aguarde todos os pedidos no Android VolleyEu estou usando o Observables para imitar a interface com minha API REST em JavaScript. Especificamente, usando a biblioteca de promessas, eu componho chamadas assim:
$q.all([
fetchResourceA(),
fetchResourceB()
])
.then(function (responses) {
...
return fetchResourceC();
})
.then(function (response) {
...
});
Neste exemplo, eu consultar dois recursossimultaneamente, coletar os resultados e, em seguida, coletar um terceiro recurso com base em alguns dos parâmetros dos recursos coletados anteriormente. O melhor que eu consegui fazer para imitar isso no RxJava é assim:
Observable o = Observable.zip(
fetchResourceA(),
fetchResourceB(),
new Func2<ResA, ResB, Object>() {
@Override
public Object call(ResA resA, ResB resB) {
...
}
}
);
Mas eu estou lutando para compô-los como eu fiz emJavaScript. Preciso simplesmente criar um segundo observável e inscrevê-lo no retorno de chamada do zip? Isso é o que eu estou fazendo agora, e funciona, mas eu gostaria de saber se há uma maneira mais elegante e mais reativa de estruturar meus pedidos.
Respostas:
1 para resposta № 1o .then
método da promessa pode ser transposto para flatMap
método em RxJava
Então, o que você pode fazer é zip
então flatMap
então flatMap
Observable.zip(fetchA(), fetchB(), (a, b) -> new Response(a, b))
.flatMap((responses) -> fetchC())
.flatMap((cResponse) -> /* whatever */)
.subscribe();
Por favor note que fetchA()
, fetchB()
, fetchC()
return Observables.
(Meu exemplo usa lambdas para maior clareza)