2017-01-25 1 views
0

Ich studiere Rx.NET und in dem folgenden Beispielcode versuche ich eine asynchrone Aufgabe durchzuführen, die beobachtet, dass Datum Zeitauswahlwert Ereignis geändert wird. Der onNext läuft perfekt, aber onError und onComplete nicht. Was mache ich falsch?Rx.NET feuert onError noch onComplete nicht

+0

Warum erwarten Sie, dass 'onError' oder' onCompleted' ausgelöst werden? Nichts beendet deinen Ereignisstrom oder wirft Fehler. – Jacob

+0

Wenn ich einen neuen Exception ("was auch immer") in den onNext hinzufügen, wird es auf onErrror nicht aufholen. Bezüglich onCompleted wie kann ich das Observable beenden, wenn es nicht wegwerfbar ist? Ich habe viele Tutorials und Codebeispiele gesehen, aber ich habe nie eine gute Erklärung dafür gefunden, wann jede Aktion aufgerufen wird. –

Antwort

0

Wenn Sie Rx nicht verwenden und einfach einen Event-Handler anhängen, kann Ihnen dieses Ereignis nicht sagen, dass es abgeschlossen ist. Der Handler wird davon ausgehen, dass es immer mehr Ereignisse geben wird, selbst wenn es nur einmal aufgerufen wird (denke an das Loaded-Ereignis in js land). Wenn Sie das Ereignis in eine Observable konvertieren, sehen Sie dasselbe Verhalten. Die Rx-Bibliothek kann nicht feststellen, ob der Ereignisstrom beendet wurde.

Sie können immer die Take-Methode verwenden, um die Anzahl der Artikel zu begrenzen, die Ihr Abonnent erhält. Hoffe, das hilft beantworten, warum nie die Observablen

MouseMove.TakeUntil(MouseUp).Subscribe(...); 
DocLoad.Take(1).Subscribe(...); 

Was die OnError enden nie aufgerufen wird - wenn Ihre Teilnehmer einen Fehler wirft, dann ist dies ein Problem mit Ihrem Teilnehmer, nicht die beobachtbaren selbst und es würde keinen Sinn machen, Lassen Sie alle anderen Abonnenten wissen, dass ein Subgauner ging.

OnError wird normalerweise verwendet, um anzuzeigen, dass ein Fehler beim Abrufen eines Werts in der Sequenz aufgetreten ist. z.B.

Observable.Create(sub => { 
    try { 
     var res = SomethingThatCanThrow(); 
     sub.OnNext(res); 
     sub.OnCompleted(); 
    } catch (Exception ex) { 
     sub.OnError(ex); 
    } 

    return Disposable.Empty; 
});