我正在尝试从一系列 API 调用中构建一个 observable,但我无法让它工作。我有什么为四个API调用ApiA,ApiB,ApiC并ApiD使用该回报可观测量RxJavaCallAdapterFactory。ApiA并且ApiB必须先调用,然后在两者都执行后调用 ApiC 和 ApiD 。执行完最后两个之后,视图被初始化。我正在使用 zip 运算符来等待呼叫完成,我不确定这是要走的路,但我很新,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();
}));
}
Run Code Online (Sandbox Code Playgroud)
鉴于我只是订阅了这种方法
viewModel.syncData().subscribe(
o -> mainAdapter.update(),
throwable -> throwable.printStackTrace()
);
Run Code Online (Sandbox Code Playgroud)
再次,我对 RxJava 相当陌生,因此任何帮助将不胜感激。谢谢
你走在正确的轨道上。
但是,请注意,.zip最后一个参数Func不是Observable<R>从其call函数返回,而是R直接返回。
所以你回到的Observable是Subscriber'sonNext而不是它的事件。
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()
}));
Run Code Online (Sandbox Code Playgroud)
这是伪代码,但我希望你明白:
Zip前 2 个调用(A、B)Pair从这些函数返回的对象Pair使用运算符进行变换zip(使用flatMap运算符)Pair与接下来的 2 个调用 (C,D)结合起来someLogic()(记住,someLogic应该返回R而不是Observable<R>)未来提示: 首先尝试在不使用 lambda 表达式的情况下编写它。然后就可以看到输入输出参数,这样写代码就更容易了。然后用 lambda 表达式重写相同的内容。
| 归档时间: |
|
| 查看次数: |
3965 次 |
| 最近记录: |