Je dois créer un abonnement à un Observable
qui est immédiatement supprimé 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.
observable.pipe(first()).subscribe(func)
, d'oùfirst
vientrxjs/operators
.RxJS possède la meilleure documentation que j'ai jamais rencontrée. En suivant le lien ci-dessous, vous accédez à un tableau extrêmement utile de cas d'utilisation de mappage de tableaux avec les opérateurs. Par exemple, sous le « Je veux prendre la première valeur » cas d'utilisation sont trois opérateurs:
first
,firstOrDefault
etsample
.Notez que si une séquence observable se termine sans aucune notification, alors l'
first
opérateur avertit les abonnés avec une erreur tandis que l'firstOrDefault
opérateur fournit une valeur par défaut aux abonnés.recherche de cas d'utilisation d'opérateur
la source
Si vous souhaitez appeler un Observable une seule fois, cela signifie que vous n'attendrez pas un flux de celui-ci. Donc, utiliser à la
toPromise()
place desubscribe()
serait suffisant dans votre cas car iltoPromise()
n'est pas nécessaire de se désinscrire.la source
await
cepromise
qui en fait une doublurePour compléter la réponse de @ Brandon , l'utilisation
first()
ou autre est également essentielle pour mettre à jour unBehaviorSubject
basé sur sonObservable
. Par exemple (non testé):la source
Version propre et pratique
En développant la réponse étonnante de M Fuat NUROĞLU sur la conversion de l'observable en promesse, voici la version très pratique de celle-ci.
La beauté de ceci est que nous pouvons utiliser cette valeur comme une variable normale sans introduire un autre bloc imbriqué!
Ceci est particulièrement pratique lorsque vous devez obtenir plusieurs valeurs à partir de plusieurs observables. Propre et net.
Bien sûr, vous devrez faire votre fonction contenant
async
si vous voulez suivre cette route. Vous pouvez également simplement.then
la promesse si vous ne voulez pas que la fonction contenant soit asynchroneJe ne sais pas s'il y a des compromis avec cette approche, n'hésitez pas à me le faire savoir dans les commentaires afin que nous en soyons conscients.
PS Si vous avez aimé cette réponse, n'oubliez pas de voter également pour la réponse de M Fuat NUROĞLU :)
la source
J'avais une question similaire.
Ci-dessous a été appelé même plus tard par différents changeurs d'État. Comme je ne voulais pas.
J'ai décidé d'essayer
unsubscribe()
après m'être abonné comme ci-dessous.subscribe(func).unsubscribe();
est commesubscribeOnce(func)
.J'espère que cela vous a aidé aussi.
la source