Gibt es eine Option, eine Variante timeout
zu haben, die nicht Throwable
ausstrahlt?RxJava Timeout ohne emiting Fehler?
Ich möchte complete
Ereignis gesendet haben.
Gibt es eine Option, eine Variante timeout
zu haben, die nicht Throwable
ausstrahlt?RxJava Timeout ohne emiting Fehler?
Ich möchte complete
Ereignis gesendet haben.
Sie von einem Fehler mit einem anderen Observable
, beispielsweise wieder aufnehmen kann:
Observable<String> data = ...
data.timeout(1, TimeUnit.SECONDS)
.onErrorResumeNext(Observable.empty())
.subscribe(...);
Sie können immer onErrorResumeNext verwenden, die den Fehler bekommen und Sie können emittieren, was Artikel wollen- Sie
/**
* Here we can see how onErrorResumeNext works and emit an item in case that an error occur in the pipeline and an exception is propagated
*/
@Test
public void observableOnErrorResumeNext() {
Subscription subscription = Observable.just(null)
.map(Object::toString)
.doOnError(failure -> System.out.println("Error:" + failure.getCause()))
.retryWhen(errors -> errors.doOnNext(o -> count++)
.flatMap(t -> count > 3 ? Observable.error(t) : Observable.just(null)),
Schedulers.newThread())
.onErrorResumeNext(t -> {
System.out.println("Error after all retries:" + t.getCause());
return Observable.just("I save the world for extinction!");
})
.subscribe(s -> System.out.println(s));
new TestSubscriber((Observer) subscription).awaitTerminalEvent(500, TimeUnit.MILLISECONDS);
}
Ich möchte Stream beenden, nachdem onError – pixel
Sie, in onErrorResumenNext Sie Ihre beobachtbare emittieren, die es wird die Pipeline zu beenden. Führe den Test aus, den ich geschrieben habe, und du wirst es verstehen. Wenn Sie mehr praktische Beispiele sehen möchten, überprüfen Sie hier https://github.com/politrons/reactive – paul
Eine einfachere Lösung, die Observable.timeout
nicht verwendet (es wird also kein Fehler mit dem Risiko des Einfangens unerwünschter Ausnahmen generiert), könnte einfach dauern, bis ein Timer abgeschlossen ist es:
Observable<String> data = ...
data.takeUntil(Observable.timer(1, TimeUnit.SECOND))
.subscribe(...);
Das ist, was dieser Code tut. Es wird Ihren Fehler in ein Observable umwandeln, das sofort beendet wird. – dwursteisen
Es ist erwähnenswert, dass diese Lösung nicht funktioniert, wenn die Möglichkeit besteht, dass Fehler von weiterem Upstream kommen, weil es auch diese fangen wird ... – forresthopkinsa