2015-12-04 5 views
8

Lassen Sie uns sagen, dass wir ein beobachtbare haben:Wie kann ich in RxJS beobachtbare vervollständigen

var observable = Rx.Observable 
    .fromEvent(document.getElementById('emitter'), 'click'); 

Wie kann ich es machen komplette (was onComplete Ereignis für alle abonnierten auslösen Beobachter)?

Antwort

13

In dieser vorliegenden Form können Sie nicht. Ihr Observable ist von einer Quelle abgeleitet, die nicht vollständig ist, so dass sie nicht selbst abgeschlossen werden kann. Was Sie tun können, ist diese Quelle mit einer vollständigen Bedingung zu erweitern. Dies würde funktionieren wie:

var end$ = new Rx.Subject(); 
var observable = Rx.Observable 
    .fromEvent(document.getElementById('emitter'), 'click') 
    .takeUntil(end$); 

Wenn Sie wollen observable beenden, tun Sie end$.onNext("anything you want here");. Das ist der Fall, wenn das Ende-Ereignis von Ihnen generiert wird. Wenn dies eine andere Quelle ist, die dieses Ereignis erzeugt (Tastendruck usw.), können Sie direkt eine Observable, die von dieser Quelle abgeleitet ist, als Argument von takeUntil ablegen.

Dokumentation:

+0

Dies scheint potenzielle Gefahr von Speicherverlusten in Browser-App zu sein. Es scheint, dass unendlich viele Beobachter mit HTML-Elementen verbunden sein können, die bereits aus dem Bereich entfernt wurden. Es kann verhindern, dass GC diese Elemente und viele andere Referenzen aus dem Speicher entfernt ... – ulfryk

+1

?? Ich folge dir nicht. Was ist das'? In jedem Fall wird der onCompleted-Handler für alle Beobachter ausgelöst, was Sie gefragt haben. Bei Speicherlecks wird der Ereignisbeobachter, der erstellt wurde, entfernt, wenn sich der letzte Beobachter von der Observable, die von "fromEvent" erstellt wurde, abgemeldet hat. – user3743222

+0

"was löst onComplete-Ereignis für alle abonnierten Beobachter aus" ist zweiter zusätzlicher Teil meiner Frage. Was ich erreichen muss, ist das Entfernen des Ereignishörers.Vollständiger Abschluss von Observable, damit ich alle veralteten Referenzen entfernen kann, wenn ich nicht mehr auf ein Ereignis horche. – ulfryk

1

Was für mich gearbeitet wird mit dem take() Operator. Es wird den vollständigen Rückruf nach x Anzahl der Ereignisse auslösen. Wenn Sie also 1 übergeben, wird es nach dem ersten Ereignis abgeschlossen.

Typoskript:

private preloadImage(url: string): Observable<Event> { 
    let img = new Image(); 
    let imageSource = Observable.fromEvent(img, "load"); 

    img.src = url; 

    return imageSource.take(1); 
} 
+0

'first()' kann anstelle von 'take (1)' verwendet werden –

1

Ich denke, was Sie suchen die dispose() Methode.

aus: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observables

Beachten Sie, dass die Methode subscribe gibt ein Wegwerfprodukt, so dass Sie zu einer Sequenz abmelden und leicht entsorgen. Wenn Sie die Dispose-Methode für die beobachtbare Sequenz aufrufen, hört der Beobachter auf, die Observable für Daten zu hören. Normalerweise müssen Sie nicht explizit abstoßen, es sei denn, Sie müssen sich vorzeitig abmelden, oder wenn die beobachtbare Sequenz der Quelle eine längere Lebensdauer hat als der Beobachter. Abonnements in Rx sind für Fire-and-Forget-Szenarien ohne die Verwendung eines Finalizers ausgelegt. Beachten Sie, dass das Standardverhalten der Observable-Operatoren darin besteht, die Subskription so schnell wie möglich zu entfernen (d. H. Wenn onCompleted- oder onError-Nachrichten veröffentlicht werden). Zum Beispiel wird der Code x für beide Sequenzen a und b subskribieren. Wenn ein Fehler ausgegeben wird, wird x sofort von b abgemeldet.

Verwandte Themen