Ich muss ein Abonnement für ein Abonnement erstellen Observable
, das sofort entsorgt wird, wenn es zum ersten Mal aufgerufen wird.
Gibt es so etwas wie:
observable.subscribeOnce(func);
In meinem Anwendungsfall erstelle ich ein Abonnement in einem Express-Routen-Handler und das Abonnement wird mehrmals pro Anfrage aufgerufen.
observable.pipe(first()).subscribe(func)
, woherfirst
kommtrxjs/operators
.RxJS hat einige der besten Dokumentationen, die mir je begegnet sind. Wenn Sie dem folgenden Link folgen, gelangen Sie zu äußerst hilfreichen Anwendungsfällen für die Tabellenzuordnung für Operatoren. Zum Beispiel unter dem Anwendungsfall „ich den ersten Wert zu übernehmen will“ sind drei Betreiber:
first
,firstOrDefault
, undsample
.Hinweis: Wenn eine beobachtbare Sequenz ohne Benachrichtigungen abgeschlossen wird,
first
benachrichtigt der Bediener die Abonnenten mit einem Fehler, während derfirstOrDefault
Bediener den Abonnenten einen Standardwert bereitstellt.Operator Use Case Lookup
quelle
Um die Antwort von @ Brandon zu ergänzen , ist die Verwendung von
first()
oder dergleichen auch wichtig, um eineBehaviorSubject
basierend auf ihrer zu aktualisierenObservable
. Zum Beispiel (ungetestet):quelle
Wenn Sie ein Observable nur einmal aufrufen möchten, bedeutet dies, dass Sie nicht auf einen Stream von ihm warten müssen. Die Verwendung von
toPromise()
anstelle vonsubscribe()
würde in Ihrem Fall ausreichen, datoPromise()
keine Abmeldung erforderlich ist.quelle
await
das könnenpromise
, was es zu einem Liner machtSaubere und bequeme Version
Hier ist die sehr praktische Version von M Fuat NUROĞLUs erstaunlicher Antwort auf die Umwandlung des Beobachtbaren in ein Versprechen.
Das Schöne daran ist, dass wir diesen Wert wie eine normale Variable verwenden können, ohne einen weiteren verschachtelten Block einzuführen!
Dies ist besonders praktisch, wenn Sie mehrere Werte von mehreren Observablen abrufen müssen. Ordentlich und sauber.
Natürlich müssen Sie Ihre Containing-Funktion festlegen,
async
wenn Sie diese Route wählen möchten. Sie können auch nur.then
das Versprechen abgeben, wenn die enthaltende Funktion nicht asynchron sein sollIch bin mir nicht sicher, ob es Kompromisse mit diesem Ansatz gibt. Lassen Sie es mich in den Kommentaren wissen, damit wir uns dessen bewusst sind.
PS Wenn Ihnen diese Antwort gefallen hat, vergessen Sie nicht, auch die Antwort von M Fuat NUROĞLU zu bewerten :)
quelle
Ich hatte eine ähnliche Frage.
Unten wurde noch später von verschiedenen Zustandswechslern aufgerufen. Da wollte ich nicht.
Ich habe mich entschlossen, es
unsubscribe()
nach dem Abonnieren wie folgt zu versuchen .subscribe(func).unsubscribe();
ist wiesubscribeOnce(func)
.Ich hoffe das hat dir auch geholfen.
quelle