如何在Rx中为这些要求构建一个漂亮的序列:
我想到了那个序列,但我不确定它是否是最佳的 (原始计划):
Observable<Long> timeoutError = Observable.timer(5, TimeUnit.SECONDS)
.concatWith(Observable.error(new Exception("TIMEOUT!")));
Observable<RequestResult> request = Observable.combineLatest(Observable.timer(1, TimeUnit.SECONDS),
Observable.from(request), new Func2<Long, RequestResult, RequestResult>() {
@Override
public RequestResult call(Long aLong, RequestResult result) {
return result;
}
});
Observable.merge(timeoutError, request) (maybe .take(1));
答案 0 :(得分:2)
test.delay(1, TimeUnit.SECONDS).timeout(5, TimeUnit.SECONDS)
test
是您想要的可观察结果。
以下是一个例子:
CountDownLatch cdl = new CountDownLatch(1);
// create tests
Observable<Observable<String>> tests = Observable.just(0, 3, 6)
.map(i -> Observable.just("request done after " + i + " seocnds").delay(i, TimeUnit.SECONDS));
// test
tests.flatMap(test -> test.zipWith(
// delay minimum 1 sec
Observable.timer(1, TimeUnit.SECONDS), (r, d) -> r)
// timeout entire observable in a mixmum of 5 sec
.timeout(5, TimeUnit.SECONDS))
.doOnTerminate(() -> cdl.countDown()).subscribe(i -> {
// valid
System.out.println("Item emitted: #" + i);
} , err -> {
// error
System.err.println("Error on item: #:" + err.getMessage());
err.printStackTrace();
} , () -> {
// done
System.out.println("Done");
});
cdl.await();