2015-11-19 153 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