【发布时间】:2014-01-18 06:52:45
【问题描述】:
所以我在玩 RX(真的很酷),我一直在转换我的 api,它访问 Android 中的 sqlite 数据库以返回 observables。
所以我开始尝试解决的问题之一自然是,“如果我想进行 3 次 API 调用,获取结果,然后在它们全部完成后进行一些处理怎么办?”
我花了一两个小时,但我最终找到了Zip Functionality,它可以轻松帮助我:
Observable<Integer> one = getNumberedObservable(1);
Observable<Integer> two = getNumberedObservable(2);
Observable<Integer> three = getNumberedObservable(3);
Observable.zip(one, two, three, new Func3<Integer, Integer, Integer, Integer>() {
@Override
public Integer call(Integer arg0, Integer arg1, Integer arg2) {
System.out.println("Zip0: " + arg0);
System.out.println("Zip1: " + arg1);
System.out.println("Zip2: " + arg2);
return arg0 + arg1 + arg2;
}
}).subscribe(new Action1<Integer>() {
@Override
public void call(Integer arg0) {
System.out.println("Zipped Result: " + arg0);
}
});
public static Observable<Integer> getNumberedObservable(final int value) {
return Observable.create(new OnSubscribeFunc<Integer>() {
@Override
public Subscription onSubscribe(Observer<? super Integer> observer) {
observer.onNext(value);
observer.onCompleted();
return Subscriptions.empty();
}
});
}
太棒了!所以这很酷。
所以当我压缩 3 个 observables 时,它们会串行运行。如果我想让它们同时并行运行,这样我最终能更快地得到结果怎么办?我玩过一些东西,甚至尝试阅读人们写的一些原始 RX 东西在 C# 中。我确信有一个简单的答案。谁能指出我正确的方向?这样做的正确方法是什么?
【问题讨论】:
-
如果我可能会问,您为什么要等到三个都完成后再进行处理?
-
@ScottSEA 当然,所以说我有一个屏幕,需要来自 SQLite 的 3 个不同元素才能正确绘制,或者 3 个不同的网络信息。在继续绘制屏幕之前,我想确保我拥有一切。
-
所以您不是等到序列完成,而是等到每个序列都有一个值?
-
@ScottSEA 我设置 api 的方式是一切都只返回一个对象然后完成。如果您觉得有更好的方法来设置它,我会全力以赴。我对 RX 很陌生,很想听听您的意见。
-
@ScottSEA 即使我要返回多个项目,我也只会发送一个项目列表而不是多个 onNext 调用。
标签: java system.reactive rx-java