web-dev-qa-db-fra.com

Créer un abonnement unique

J'ai besoin de créer un abonnement à une Observable qui est immédiatement éliminée lors de son premier appel.

Y a-t-il quelque chose comme:

observable.subscribeOnce(func);

Mon cas d'utilisation, je crée un abonnement dans un gestionnaire d'itinéraire express et l'abonnement est appelé plusieurs fois par demande.

111
Berkeley Martinez

Pas tout à fait certain de ce dont vous avez besoin, mais si vous voulez uniquement observer la première valeur, utilisez alors first() ou take(1):

observable.first().subscribe(func);

remarque: .take(1) et .first() se désabonnent automatiquement lorsque leur condition est remplie.

Mise à jour à partir de RxJS 5.5+

D'après les commentaires de Coderer .

import { first } from 'rxjs/operators';

observable.pipe(
            first()
          )
          .subscribe(func);

Voici pourquoi

203
Brandon

RxJS dispose de la meilleure documentation que j'ai jamais rencontrée. Le lien ci-dessous vous mènera à une table extrêmement utile mappant des cas d'utilisation pour les opérateurs. Par exemple, sous le cas d'utilisation "Je veux prendre la première valeur", il y a trois opérateurs: first, firstOrDefault et sample.

Remarque: si une séquence observable se termine sans notification, l'opérateur first notifie les abonnés avec une erreur tandis que l'opérateur firstOrDefault fournit une valeur par défaut aux abonnés.

recherche de cas d'utilisation d'opérateur

25
DetweilerRyan

Pour compléter @ la réponse de Brandon , il est également essentiel d'utiliser first() ou similaire pour mettre à jour une BehaviorSubject en fonction de sa Observable. Par exemple (non testé):

var subject = new BehaviorSubject({1:'Apple',2:'banana'});
var observable = subject.asObservable();

observable
  .pipe(
    first(), // <-- Ensures no stack overflow
    flatMap(function(obj) {
      obj[3] = 'pear';
      return of(obj);
    })
  )
  .subscribe(function(obj) {
    subject.next(obj);
  });
0
Andy