[英]RxJava using zip to chain multiple calls
我正在尝试从一系列API调用中构造一个observable,但我无法让它工作。 我有什么为四个API调用ApiA
, ApiB
, ApiC
和ApiD
返回使用观测量RxJavaCallAdapterFactory
。 必须首先调用ApiA
和ApiB
,然后在执行两者之后调用ApiC和ApiD。 执行最后两个后,View被初始化。 我正在使用zip运算符等待调用完成,我不确定是否RxJava
,但我对RxJava
很新,所以如果还有其他更好的方法,请告诉我。 下面是我的代码,其中的评论显示了我遇到的问题
public Observable syncData() {
return Observable.zip(
// these two calls are executed
callApiA(),
callApiB(),
(o, o2) -> Observable.zip(
/* these two calls are not executed, it seems as if this zip has
no subscriber but i don't know why ... */
callApiC(),
callApiD(),
(o, o2) -> {
someLogic();
return Observable.empty();
}));
}
而在视野中我只是习惯了这种方法
viewModel.syncData().subscribe(
o -> mainAdapter.update(),
throwable -> throwable.printStackTrace()
);
我再次对RxJava相当新,所以任何帮助都将受到赞赏。 谢谢
你走在正确的轨道上。
但是,请注意.zip
最后一个参数, Func
不会从它的call
函数返回Observable<R>
,而是直接返回R
所以你将Observable
返回到Subscriber
者的onNext
而不是它的事件。
需要flatMap
介于两者之间:
Observable.zip(callApi1(), callApi2(), Pair::new)
.flatMap((pair) -> Observable.zip(
Observable.just(pair.first()),
Observable.just(pair.second()),
callApiC(),
callApiD(),
(t1, t2, t3, t4) -> {
someLogic()
}));
这是伪代码,但我希望你明白这个想法:
Zip
前2个电话(A,B) Pair
对象 zip
运算符转换Pair
(使用flatMap
运算符) Pair
someLogic()
函数返回组合对象(记住, someLogic
应该返回R
而不是Observable<R>
) 未来提示:首先尝试不使用lambda表达式编写它。 然后您可以看到输入和输出参数,因此编写代码更容易。 然后用lambda表达式重写相同的内容。
重要的是Observables在订阅之前不会被执行。
因此,为了解释发生了什么,第一个Observable.zip
被赋予了一个组合函数(callApiA(),callApiB()) -> Observable<Something>
,因此它产生一个Observable<Observable<Something>>
。 observable作为元素发送,从不订阅。
要修复它,你需要展平可观察流: Observable.zip(...).flatmap(s -> s)
。 这会使流变为Observable<Something>
并订阅内部observable。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.