【发布时间】:2015-07-29 23:15:52
【问题描述】:
我想结合两个 observables:一个是检查用户是否被授权获取数据,另一个是实际获取数据,我想在获取数据的同时进行授权以减少总延迟。这是一个不平行的例子:
public static void main(String[] args) {
long startTime = currentTimeMillis();
Observable<Integer> result = isAuthorized().flatMap(isAuthorized -> {
if (isAuthorized) return data();
else throw new RuntimeException("unauthorized");
});
List<Integer> data = result.toList().toBlocking().single();
System.out.println("took: " + (currentTimeMillis() - startTime) + "ms");
System.out.println(data);
assert data.size() == 10;
}
private static Observable<Boolean> isAuthorized() {
return Observable.create( s -> {
try { sleep(5000); } catch (Exception e) {} // simulate latency
s.onNext(true);
s.onCompleted();
});
}
private static Observable<Integer> data() {
return Observable.create(s -> {
for (int i = 0; i < 10; i++) {
try { sleep(1000); } catch (Exception e) {} // simulate long running job
s.onNext(i);
}
s.onCompleted();
});
}
执行此操作的总时间为 15 秒,如果对授权和数据获取的调用是并行的,则应为 10 秒。怎么做?理想情况下,我还想在等待授权完成时最多缓存多少数据项在内存中。
顺便说一句,我已经阅读了excellent answer about paralleling observables,但现在仍然不知道如何解决我的问题。
【问题讨论】:
标签: java reactive-programming rx-java