1

タイムアウトによってオブザーバブルの寿命を制限しようとしています:

def doLongOperation() = {
   Thread.sleep(duration)
   "OK"
}

def firstStep = Observable.create(
  (observer: Observer[String]) => {
    observer.onNext(doLongOperation())
    observer.onCompleted()
    Subscription()
  }
)

firstStep
  .timeout(1 second)
  .subscribe(
    item => println(item),
    throwable => throw throwable,
    () => println("complete")
  ) 

次の結果を区別したいと思います。

  1. Observable はタイムアウトで終了しました。結果は得られませんでした
  2. 実行中にスローされた例外
  3. 実行は正常に終了し、戻り値

ケース 2 と 3 はパーシャル onNext と onError で問題なく処理できますが、オブザーバブルがタイムアウトで終了したかどうかを検出するにはどうすればよいですか?

もう 1 つ: 私のコードには obeserver.onCompleted() への呼び出しがありますが、ブロック onComplete に入ったことがありません。なんで?

4

2 に答える 2

1

タイムアウトが発生した場合、それTimeoutExceptionは計算スレッドで発行され、最終的にthrow throwableは無視され、メインスレッドはそれを認識せず、見ることができません。タイムアウトの後に追加toBlockingして、例外が同じスレッドで終了するようにすることができます。

firstStep
  .timeout(1 second)
  .toBlocking()
  .subscribe(
    item => println(item),
    throwable => println(throwable),
    () => println("complete")

)

于 2015-11-12T16:04:36.340 に答える