Warum würden Sie jemals ein Observable abonnieren oder gar erstellen, das niemals etwas bringt, nicht einmal einen Fehler, noch eine Vervollständigung?Was wäre eine echte Welt Verwendung oder Notwendigkeit der Rx-Operator nie?
Antwort
Ich habe das selbst betrachtet. Die Schlussfolgerung, zu der ich kam, ist, dass Frameworks, von denen Sie abhängig sind, dies verwenden würden (oder Sie würden dies verwenden, wenn Sie ein Framework erstellen). Ich sehe es als das Äquivalent eines leeren IEnumerable
. Betrachten Sie den Fall, in dem Sie eine Methode aufrufen, die eine IEnumerable
zurückgibt. Vielleicht hängt die IEnumerable
, die von der Methode zurückgegeben wird, von den Parametern ab, die an die Methode übergeben werden; In einigen Fällen können keine Daten zurückgegeben werden. Einige ... Leute (ich habe mit einigen wenigen Worten hier gekämpft) könnten null
zurückgeben, aber ein erleuchteter Entwickler würde eine leere IEnumerable
zurückgeben. Ich sehe ein Observable, das niemals etwas ergibt, das einem leeren IEnumerable
entspricht. Natürlich könnten Sie das Argument, dass Observable.Empty
(die eine Observable, die sofort beendet) zurückgibt, ist wirklich das Äquivalent einer leeren IEnumerable
, aber ich denke, es hängt wahrscheinlich von der Situation ab. Wer das Framework gestaltet, müsste entscheiden, welches semantisch korrekt ist, Observable.Empty
oder Observable.Never
.
Das sind meine zwei Cent. Vielleicht hat jemand einen besseren Grund.
Ich habe es mit Observable.Window und Observable.Buffer für die abschließende beobachtbare verwendet. Dies ist ein triviales Beispiel, da der echte Code zu komplex ist, um ihn zu posten.
static IObservable<Unit> CloseWindow(int interval)
{
if (interval <= 0)
{
return Observable.Never<Unit>();
}
return Observable.Interval(TimeSpan.FromSeconds(interval)).Select(_ => Unit.Default);
}
Verwenden Sie beim Gruppieren von Daten für Analysten und manchmal erfordert es alle Daten und manchmal nicht. Wieder triviales Beispiel
static IObservable<double> AverageOfWindow(IObservable<int> source, int interval)
{
return source.Buffer(CloseWindow(interval)).Select(o => o.Average());
}
Wenn Leere verwenden würde es nie zu einem Ergebnis führen und durch die Verwendung Nie ist es im Grunde durch die Buffer und Fenster Methoden übergeben. Könnte das Observable schreiben, um den Puffer zu überspringen, wenn es nicht benötigt wird, aber einfacher und weniger zu wartenden Code, wenn das CloseWindow über die gesamte Logik verfügt, um festzustellen, wann die Puffersequenz geschlossen wird. Auch in diesem Beispiel ist es trivial, aber in echtem Code ist die Logik zu entscheiden, wann der Puffer schließt, komplexer.
Vielen Dank. Dies sind die Überladungen von 'Buffer', die ich nicht verstehe. Ich konnte nirgendwo eine Erklärung für sie finden. Könnten Sie das bitte erklären? Ich habe hier eine separate Frage für sie gestellt: http://stackoverflow.com/q/37824033/303685 –
Es ist ein grundlegendes "Atom" in der Zusammensetzung der beobachtbaren Ereignisströme und kommt in einer Vielzahl von Situationen - aber eine der häufigsten Anwendungen für Observable.Never
in der Praxis ist in schriftlichen Tests. Es ermöglicht beispielsweise eine robuste Überprüfung der Timeout-Logik - und wird oft mit den TestScheduler
oder anderen virtuellen Zeitsteuerungen in Testszenarien kombiniert. Wenn Sie den Quellcode von Rx selbst untersuchen, finden Sie ihn in vielen Komponententests.
Schönes Denken. Eine Verwendung, die ich gesehen habe, ist auf dieser Seite (http://rxwiki.wikidot.com/101samples#toc39), wo es wie ein "Missing" -Argument verwendet wird, das Sie verwendet haben, um an COM-Server zu übergeben, wenn Sie OLE-Automatisierung wie von machen VBA. Mit anderen Worten, wenn jemand möchte, dass du ein "IObservable" passierst und du sagst: "Es ist mir egal, ich gebe dir keins, weil ich keins habe und es mir wirklich egal ist, ob oder nicht, du bekommst einen an diesem Ort. " Dies korreliert etwas mit Ihrem Kommentar, und es zieht auch eine feine Linie zwischen "Nie" und "Leer". –