2016-05-06 10 views
0

Mit Rxjs 5, möchte ich eine Observable abonnieren und den Stream mit dem letzten emittierten Wert beginnen. Der Operator '.cache' soll dafür gebaut werden (denke ich), aber ich kann es nicht zum Laufen bringen. Ich habe einen kleinen Test gemacht, bei dem man ein Observable (durch Klicken auf einen Knopf) abfeuern konnte und dann 3 Sekunden später abonnieren. Theoretisch sollte ich diese Klickemission beim Abonnement bekommen, aber das tue ich nicht.rxjs5 Erhalten letzten emittierten Wert bei Abonnement

https://github.com/ReactiveX/RxJS/commit/4308a04

http://codepen.io/BradLee/pen/VaqreL

let btn = document.querySelector(`btn`), 
    btn$ = Rx.Observable.fromEvent(btn, `click`) 
      .cache(1); 

setTimeout(() => { 
    btn$.subscribe(evt => console.log('fired')); 
}, 3000); 

Antwort

1

Das Problem RxJS Zusammenhang nicht. Ihre Anfrage Wähler ist nicht richtig, wenn Sie ändern:

let btn = document.querySelector(`btn`), 

zu

let btn = document.querySelector('button') 

Es funktioniert.

bearbeiten

Bis mindestens ein Abonnement mit cache ist, wird es keine Ereignisse emittieren. Wenn Sie Ereignisse empfangen müssen, bevor die subscribe auftritt, müssen Sie entweder ein sofortiges Abonnement erstellen, damit Sie mit dem Empfang von Ereignissen beginnen können.

let btn = document.querySelector(`btn`), 
    btn$ = Rx.Observable.fromEvent(btn, `click`) 
      .cache(1); 

btn$.subscribe(); 

Oder benötigen Sie den publishReplay Operator verwenden und mit ihm verbinden statt:

let btn = document.querySelector(`btn`), 
    btn$ = Rx.Observable.fromEvent(btn, `click`) 
      .publishReplay(1); 

btn$.connect(); 
+0

, die ein Problem war, aber es nicht das rxjs Problem zu lösen. Wenn Sie auf die Schaltfläche klicken, bevor der 3-Sekunden-Timer ausgelöst wird, sollten Sie eine Konsolennummer erhalten, wenn der Timer ausgelöst wird, aber Sie nicht. –

+0

Das ist das erwartete Verhalten. Sie haben das Observable noch nicht abonniert, so dass es noch keine Events erhalten kann. Ich habe das auch mit einer Lösung bearbeitet. – paulpdaniels

Verwandte Themen