我一直在调整我的Android应用程序以使用RxJava,但我在这方面遇到了一些麻烦。正如我在上一篇文章(Wait for all requests in Android Volley)中所建议的那样,我使用Observables来模仿我在JavaScript中与REST API的接口方式。具体来说,使用promise库,我会编写如下调用:
$q.all([
fetchResourceA(),
fetchResourceB()
])
.then(function (responses) {
...
return fetchResourceC();
})
.then(function (response) {
...
});
在此示例中,我同时查询两个资源,收集结果,然后根据先前收集的资源中的一些参数收集第三个资源。在RxJava中我能够做到的最好的模仿是这样的:
Observable o = Observable.zip(
fetchResourceA(),
fetchResourceB(),
new Func2<ResA, ResB, Object>() {
@Override
public Object call(ResA resA, ResB resB) {
...
}
}
);
但我正在努力像在JavaScript中那样构建它们。我是否需要简单地创建第二个observable并在zip的回调中订阅它?这就是我现在正在做的事情,并且它有效,但我想知道是否有更优雅,更具反应性的方式来构建我的请求。
答案 0 :(得分:1)
来自promise的.then
方法可以转换为RxJava中的flatMap
方法
那么,您可以做的是zip
然后flatMap
然后flatMap
Observable.zip(fetchA(), fetchB(), (a, b) -> new Response(a, b))
.flatMap((responses) -> fetchC())
.flatMap((cResponse) -> /* whatever */)
.subscribe();
请注意,fetchA()
,fetchB()
,fetchC()
会返回Observables。
(我的例子是为了清晰起见使用lambdas)