2015-11-19 47 views
0

如何的Rx建立一个美丽的序列,用于要求:RxJava,请求的执行时间必须> 1秒,但<5秒

  • 请求的执行时间必须> 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)); 

回答

2

有什么不对的简单运营商​​和timeout

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

.timeout是好的,非常感谢!但是有了延迟,我们将额外的1秒添加到源观测值(测试/请求)。如果请求执行时间超过1秒,我们不需要额外的延迟。 – ADK

+1

@ADK更改为'zip',这是你需要的吗? –

+0

我已经结束了Observable.combineLatest(Observable.just(request),Observable.timer(1,TimeUnit.SECOND).take(1))。timeout(5,timeUnit.SECOND); – ADK

相关问题