Interval 演算子を使用していますが、パイプラインで例外が発生した場合でもアイテムを発行し続けたいと考えています。
そこでonErrorResumeNext
、例外の場合にアイテムを発行することを試みます。しかし、このアイテムを発行した後、間隔がそれ以上のアイテムの発行を停止することがわかりました。
ここで私の単体テスト。
@Test
public void testIntervalObservableWithError() {
Subscription subscription = Observable.interval(50, TimeUnit.MILLISECONDS)
.map(time -> "item\n")
.map(item -> item = null)
.map(String::toString)
.onErrorResumeNext(t-> Observable.just("item with error emitted"))
.subscribe(System.out::print, t->{
System.out.println(t);
}
);
TestSubscriber testSubscriber = new TestSubscriber((Observer) subscription);
testSubscriber.awaitTerminalEvent(20000, TimeUnit.MILLISECONDS);
}
私はこの振る舞いに混乱しています。onErrorResumeNext
解決:
いくつかの説明の後、エラーが発生すると、観測可能な t´s が完了していることに気付きました。そのため、例外を持つ可能性のあるオブザーバブルを別のオブザーバブルにラップすることになり、flatMap を使用しています。そのため、メインの Observable はアイテムを放出し続けます。
@Test
public void testIntervalObservableWithError() {
Observable.interval(100, TimeUnit.MILLISECONDS)
.map(time -> "item\n")
.flatMap(item -> Observable.just(item)
.map(String::toString))
.subscribe(System.out::print);
TestSubscriber testSubscriber = new TestSubscriber();
testSubscriber.awaitTerminalEvent(5000, TimeUnit.MILLISECONDS);
}
そのような魔法をすべて実行できるオペレーターがいる場合、私は知りたい.
リグラード