繁体   English   中英

RxJava使用zip链接多个调用

[英]RxJava using zip to chain multiple calls

我正在尝试从一系列API调用中构造一个observable,但我无法让它工作。 我有什么为四个API调用ApiAApiBApiCApiD返回使用观测量RxJavaCallAdapterFactory 必须首先调用ApiAApiB ,然后在执行两者之后调用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()
           }));

这是伪代码,但我希望你明白这个想法:

  1. Zip前2个电话(A,B)
  2. 返回从这些函数返回的一Pair对象
  3. 使用zip运算符转换Pair (使用flatMap运算符)
  4. 用接下来的2个电话(C,D)组成这Pair
  5. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM