RxJava,请求的执行时间必须> 1秒但是< 5秒

时间:2015-11-19 19:23:40

标签: android rx-java

如何在Rx中为这些要求构建一个漂亮的序列:

  • 请求的执行时间必须是> 1秒(请求可以提前完成,但结果应该在1秒之后由订户接收,就像它执行超过1秒)和< 1秒。 5秒(否则发出超时错误)?

我想到了那个序列,但我不确定它是否是最佳的 (原始计划):

   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));

1 个答案:

答案 0 :(得分:2)

简单运算符delaytimeout有什么问题?

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();