Frage

Hier ist ein Scala-Code, den ich derzeit habe:

val b= beobachtbar.Interval (1 Sekunde) .map (n=> wenn (n% 2== 1) Wirf neue Ausnahme, sonst n * n)

b.scride (n=> println (n), e=> druckln ("fehler"), ()=> Println ("Fertig"))

und hier ist meine Ausgabe:

0
Fehler

Wie kann ich mein beobachtbares Ändern ändern, damit er einfach nach jedem Fehler ständig weitergeht und ich habe eine solche Ausgabe:

generasacodicetagpre.

War es hilfreich?

Lösung

Sie können eine der verschiedenen Fehlerhandleiter verwenden. Ich denke, in Ihrem Fall könnte OnErorflatmap die richtige Wahl sein:

Wiki

Javadoc

Leider ist OnErrorflatMap nicht (ab Version 0.19.0) Teil der Scala-API.

Andere Tipps

Ich hatte die gleiche Frage, und wurde enttäuscht, dass es keine OnErrorflatmap für Scala RX gab. Also nahm ich einen Stich Beim Implementieren dieser Funktionalität selbst.

Meine Lösung ist unten gezeigt (siehe eine Lösung). Die Schlüsselmethode ist dieses:

generasacodicetagpre.

Details von "Wiederherstellen" -Methode

Das erste Argument zum "Wiederherstellen" ist das beobachtbare, dass Sie auch danach weitergehen möchten Es wirft eine Ausnahme. Ich habe alle Arten anderer Ansätze ausprobiert, aber das war der einzige, der dafür funktionierte mich. Ich hatte zunächst erwartet, Scala RXs OnArRorReTurn, um einen Fehler in den von meiner Erholung diktierten Wert zuzuordnen Funktion, und dann weitergehen, aber ich fehlte den ganzen Punkt des "beobachtbaren Vertrags", was das ist Eine beobachtbare Bedürfnisse muss aufhören, weitere Ereignisse nach dem Einschaltung oder OnError zu senden. Jegliches beobachtbares Spucken von Ereignissen fort, nachdem ein Fehler auf "pathologisch" gekennzeichnet ist (und von der höflichen Gesellschaft ordnungsgemäß gemasert), Wie hier diskutiert: https://github.com/reactivex/rxjava/wiki/phantom -Operatoren # onErorflatmap

Die Nutzlast erfolgreicher OnNext-Anrufe werden in einem Erfolg eingewickelt (), während die Ausnahme ausgenommen wird von oreerrorresumenext, der einen verketteten beobachtbaren Bach von (1) eine beobachtbare Verpackung erzeugt der Fehler und (2) eine Instanz des Ziels, die in einem rekursiven Anruf eingewickelt werden, um sich zu erholen. Ich anfangs besorgt über unendliche Rekursion .. Aber alles hat gut ausgerichtet.

Einschränkungen

Ich sollte das erwähnen, dass im Falle der ursprünglichen Posterfrage -, die beobachtbar.Interval verwendet, dies würde nicht gut funktionieren, da die Erholung (Ziel) das ursprüngliche Bottomable.Interval sein würde, das beginnen würde von Anfang an emittieren, so dass Sie niemals Fortschritte machen würden. Für so etwas wie Intervall würden Sie Sie müssen Ihr eigenes Timer-basiertes Intervall schreiben, das neu gestartet werden kann. Der Ausnahmewert würde hoffentlich Geben Sie Ihnen genügend Informationen, um Ihnen den Wert mitzuteilen, von dem Sie neu starten müssen.

generasacodicetagpre.

Hier ist eine teilweise Ausgabe eines Laufs des obigen Codes:

generasacodicetagpre.

Ich wollte nicht, dass diese Antwort für immer los ist, also übersprung ich einige Details zu alternativen Ansätzen, die ich angenommen habe, um dieses Problem zu lösen, das Sie über hier , wenn Sie interessiert sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top