2016-05-11 13 views
2

Ich bin immer noch herauszufinden, reaktive Programmierung, so bin ich mir ziemlich sicher, dass dies sehr einfach ist, aber die Anzahl der Stream-Transformationen ist ziemlich überwältigend für einen Anfänger.RxJS warten bis das Versprechen gelöst

Ich erstelle ein Observable von einem DOM-Ereignis. Dieses Ereignis sollte wiederum einen REST-Aufruf auslösen, und alle anderen DOM-Ereignisse werden ignoriert, bis dieses Ereignis behoben wurde.

const stream = Observable.fromEvent(document, 'some-event') 
stream 
    .flatMap(() => httpRestService()) 
    .subscribe(() => { 
    }) 

Wie ignoriere ich die Ereignisse aus dem Stream, bis das letzte HTTP-Versprechen gelöst wurde?

DOM event 
A - - - - B - - - - C 
HTTP event 
D ...........done - C 
+0

Zunächst gibt ein Beobachter keine Werte aus, er empfängt Werte. Hier ist also Ihr Beobachter beobachtbar. Dann weiß ich nicht, was du mit "ignoriert" meinst. Sind diese Ereignisse verloren oder in der Warteschlange? Der beste Weg, Ihre Frage zu stellen, besteht darin, Eingaben und erwartete Ausgaben anzugeben. Dies ist am besten mit einem Marmor-Diagramm gemacht – user3743222

+0

@ user3743222 aktualisiert – Harangue

+0

vielleicht 'skipUntil' wäre das, was Sie suchen? http://reactivex.io/documentation/operators/skipuntil.html – Stephen

Antwort

4

Sie könnten flatMapFirst versuchen, was zu tun scheint, was Sie wollen. Der folgende Code könnte funktionieren (jsfiddle here - auf eine beliebige Stelle):

const stream = Observable.fromEvent(document, 'some-event') 
stream 
    .flatMapFirst(() => httpRestService()) 
    .subscribe(() => { 
    }) 

Zitiert in der Dokumentation:

Der flatMapFirst Operator ist ähnlich wie die flatMap und concatMap oben beschriebenen Verfahren jedoch nicht emittieren alle Die Objekte, die von allen Observablen ausgegeben werden, die der Operator durch die Transformation von Objekten aus dem Quellobservable generiert, flatMapFirst hingegen propagiert das erste Observable ausschließlich, bis es abgeschlossen ist, bevor es mit dem Abonnieren des nächsten Observable beginnt. Observables, die vor dem Abschluss der aktuellen Observable-Version erscheinen, werden gelöscht und werden nicht weitergegeben.

UPDATE

auf den Quellcode der Suche (https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/switchfirst.js) scheint es, dass, während der der Strom beobachtbar nicht abgeschlossen ist, werden alle eingehenden Observablen in der Zwischenzeit verworfen werden, das heißt nicht abonniert.

Wenn also das Abonnieren dieser Observablen den http-Aufruf auslöst (wäre es interessant, den Code für httpRestService zu sehen), dann gibt es keinen unnötigen http-Aufruf. Wenn diese Aufrufe durch Aufruf der Funktion sofort ausgelöst werden und das Ergebnis durch ein Observable passiert wird, besteht die Möglichkeit, dass diese Aufrufe tatsächlich unnötig ausgelöst werden. In diesem Fall ist dieses Problem mit dem Operator defer einfach zu lösen, um den http-Aufruf nur zum Zeitpunkt des Abonnements auszuführen. Kurz gesagt, Sie benötigen eine faule Ausführung der Ruheanforderung, wenn Sie sie noch nicht haben.

+0

Ich bin glücklich zu wissen, was mit der vorgeschlagenen Lösung falsch ist, wie ich es beobachtet habe, wurde downvoted. – user3743222

+0

Das ist perfekt. Vielen Dank! – Harangue

+1

Sind Sie sicher, dass Sie geben was Sie wollen? Wenn ich mich nicht irre, ruft dies den httpRestService-Aufruf für jedes Dokumentereignis auf, es wirft alle Ergebnisse einfach weg, bis der vorherige Aufruf zurückgegeben wurde. –

Verwandte Themen