web-dev-qa-db-fra.com

Comment puis-je terminer Observable dans RxJS

Disons que nous avons un Observable:

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

Comment puis-je le faire Complete (ce qui déclenchera onComplete événement pour tous les abonnés Observateurs)?

12
ulfryk

Sous cette forme, vous ne pouvez pas. Votre observable est dérivé d'une source qui ne se termine pas et ne peut donc pas se compléter elle-même. Ce que vous pouvez faire, c'est étendre cette source avec une condition complète. Cela fonctionnerait comme:

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

Lorsque vous voulez terminer observable, vous faites end$.onNext("anything you want here");. C'est dans le cas où l'événement de fin est généré par vous. S'il s'agit d'une autre source générant cet événement (pression de touche, etc.), vous pouvez directement placer un observable dérivé de cette source comme argument de takeUntil.

Documentation:

26
user3743222

Ce qui a fonctionné pour moi, c'est d'utiliser l'opérateur take () . Il déclenchera le rappel complet après x nombre d'événements. Donc en passant 1, il se terminera après le premier événement.

Manuscrit:

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

    img.src = url;

    return imageSource.take(1);
}
3
Tomas Klingen

Je pense que ce que vous recherchez est la méthode dispose().

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

Notez que la méthode d'abonnement renvoie un jetable, de sorte que vous pouvez vous désabonner d'une séquence et la supprimer facilement. Lorsque vous appelez la méthode d'élimination sur la séquence observable, l'observateur cesse d'écouter l'observable pour les données. Normalement, vous n'avez pas besoin d'appeler explicitement Dispose sauf si vous devez vous désabonner tôt ou lorsque la séquence observable source a une durée de vie plus longue que l'observateur. Les abonnements dans Rx sont conçus pour les scénarios d'incendie et d'oubli sans l'utilisation d'un finaliseur. Notez que le comportement par défaut des opérateurs observables consiste à supprimer l'abonnement dès que possible (c'est-à-dire lorsqu'un message onCompleted ou onError est publié). Par exemple, le code souscrira x aux deux séquences a et b. Si a renvoie une erreur, x sera immédiatement désabonné de b.

1
Aiko Mastboom