2016-01-04 5 views
11

Ich habe angefangen mit RxJS5 zu spielen, und jetzt sehen, dass es keine shareReplay Methode mehr gibt.Muster für shareReplay (1) in RxJS5

Es ist durchaus möglich, dass ich oft shareReplay in RxJS4 missbraucht, aber jetzt bin ich kämpfen, um das Verhalten zu bekommen, was ich will, das heißt:

  • erstellen eine beobachtbare
  • auf die beobachtbaren abonnieren und die beobachtbaren erzeugt einen Wert
  • auf die beobachtbaren ein zweites Mal abonnieren, und ich bekomme den gleichen ersten Wert
  • beobachtbare einen zweiten Wert erzeugt, und beiden Abonnements erhalten den zweiten Wert

Wie implementiere ich das mit RxJS5?

Im Allgemeinen glaube ich, verstehe ich die RxJS-Betreiber ganz gut, aber die ganze Kälte, heiß, veröffentlichen, verbinden ist ziemlich unklar für mich. Gibt es eine gute Referenz, die zeigt, wie ich feststellen kann, welche Art von Observablen ich habe, damit ich logisch herausfinden kann, warum ein Subskribent keine Werte erhält oder warum ein Observable mehrere Male ausgeführt wird?

EDIT

Glückliche Nachrichten, shareReplay() ist zurück in RxJS 5.4.0:

Changelog: https://github.com/ReactiveX/rxjs/blob/892700dd4f5d5e5f9ae9276ede32208f4390c5e9/CHANGELOG.md#540-2017-05-09

Barebones Dokumentation: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-shareReplay

Antwort

18

Diese Frage wird am besten beantwortet Mitglieder, die an Rxjs5 teilnehmen, aber hier ist meine Aufnahme:

  • shareReplay ist der multicast Operator mit einem ReplaySubject, gefolgt von einem refCount. Also würde ich wetten, dass publishReplay(x).refCount() ziemlich nah an der shareReplay Verhalten sein sollte. In jedem Fall gibt Ihnen publishReplay bereits alle Punkte, die Sie erwähnt haben. Die refCount fügt die Abmeldung hinzu, wenn keine weiteren Beobachter vorhanden sind (refCount auf 0 verringert).
  • können Sie sich die Spezifikationen hier http://reactivex.io/rxjs/test-file/spec-js/operators/publishReplay-spec.js.html ansehen. Siehe Zeile 127 ab var replayed = source.publishReplay(1).refCount();, die Ihrer shareReplay(1) entsprechen sollte.

Über den Rest Ihrer Frage:

  • Ich denke, wir alle wollen, dass good reference that shows how to find what kind of observable I have.... Es gibt viele Orte, einschließlich Rxjs4 Dokumentation, wo Sie Erklärungen über heiße und kalte Observablen finden.
  • Here und sind einige Beispiele für Ressourcen.

Folgt mein gegenwärtiges Verständnis der Sache:

  • Themen heiß sind (meist sowieso, wie Sie, dass eine Wiederholung Thema ein Verhalten näher als ein kalten beobachtbaren hat argumentieren könnten)
  • Alle Observablen sind kalt, sofern nicht explizit anders angegeben.
  • unter den expliziten Möglichkeiten, eine kalte beobachtbare heiß zu machen, haben Sie die multicast-Operator und seine Derivate share, publish, shareReplay usw. Diese Operatoren intern betreffen alle Themen.
  • Beachten Sie, dass es für Sie nicht sichtbar sein muss, dass diese Operatoren verwendet wurden. Aber in diesem Fall sollten Sie die API oder die Dokumentation explizit angeben. Zum Beispiel ist Rx.Observable.fromEvent('input','click') heiß. Sie können in seiner Implementierung sehen, dass es irgendwo einen share gibt.
  • zu der Heiß/Kalt-Dichotomie müssen Sie die connectable Art hinzufügen, die, bis es verbunden ist, weder heiß noch kalt ist.
  • defer führen immer zu einer kalten beobachtbar.
  • schließlich ändern einige Operatoren nicht die Natur des Observablen, sondern erzeugen intern heiße Observables und leiten sie in ihrem Stream weiter. Dies ist zum Beispiel der Fall groupBy. op1.op2.groupBy ist kalt, aber es werden heiße Observablen als Werte im resultierenden Strom ausgegeben. In diesen Fällen kann Ihnen nur die Dokumentation (falls vorhanden) helfen, dies herauszufinden. Sonst der Quellcode und die Testspezifikationen. Oder nach SO fragen.
+1

Vielen Dank! publishReplay (1), gefolgt von connect() löste mein spezielles Problem [und vielleicht hätte shareReplay (1) es auch nicht gelöst ...] Der Rest, den du geschrieben hast, ist sehr hilfreich und ich werde das verwenden und die Verbindungen zu Fortschritt, um alles zu verstehen. –

+1

korrigierter veralteter Link – user3743222