Ich weiß nicht, wie ich einen Wert aus Observable extrahieren soll, der von einer Funktion zurückgegeben werden soll, in der Observable vorhanden ist. Ich brauche nur einen Wert davon, um zurückgegeben zu werden, sonst nichts.
Aktuelle Version, die funktioniert
function getValueFromObservable() {
this.store.subscribe(
(data:any) => {
console.log(data)
}
)
}
getValueFromObservable()
Ich brauche das, um zu funktionieren, um den Wert zurückzugeben, und dann:
function getValueFromObservable() {
this.store.subscribe(
(data:any) => {
return data
}
)
}
console.log(getValueFromObservable())
Was mache ich hier falsch?
typescript
angular
rxjs
rxjs5
Teddy
quelle
quelle
subscribe
Antworten:
BEARBEITEN: Der Code wurde aktualisiert, um Änderungen an der Funktionsweise von Pipes in neueren Versionen von RXJS widerzuspiegeln. Alle Operatoren (in meinem Beispiel) sind jetzt in den Operator pipe () eingeschlossen.
Mir ist klar, dass diese Frage schon eine Weile her ist und Sie sicherlich schon eine richtige Lösung gefunden haben, aber für alle, die danach suchen, würde ich vorschlagen, sie mit dem Versprechen zu lösen, das asynchrone Muster beizubehalten.
Eine ausführlichere Version würde ein neues Versprechen erstellen:
Auf der Empfangsseite müssen Sie dann "warten", bis das Versprechen mit so etwas gelöst ist:
Eine schlankere Lösung wäre stattdessen die Verwendung von .toPromise () von RxJS:
Die Empfangsseite bleibt natürlich die gleiche wie oben.
quelle
getValueFromObservable
Funktion?Dies ist nicht genau die richtige Idee der Verwendung
Observable
In der Komponente müssen Sie ein Klassenmitglied deklarieren, das ein Objekt enthält (etwas, das Sie in Ihrer Komponente verwenden werden).
Dann wird a
Service
Ihnen Folgendes zurückgebenObservable
:Component
sollte sich darauf vorbereiten, einen Wert daraus abrufen zu können:Sie müssen
Observable
einer Variablen einen Wert von a zuweisen :Und Ihre Vorlage wird Variable verbrauchen
name
:Eine andere Möglichkeit der Verwendung
Observable
ist dieasync
Pipe http://briantroncone.com/?p=623Hinweis : Wenn es nicht das ist, was Sie fragen, aktualisieren Sie Ihre Frage bitte mit weiteren Details
quelle
name
außerhalb des Rückrufs verfügbar gemacht werden kann, indem es dername
Variablen der Komponente zugewiesen wird.name
In Ihrem Fall ist es nicht möglich, synchron zurückzukehren.Oninit
Was ist, wenn ich explizit zurückkehren mussthis.actions$.ofType(SearchActions.SEARCH_MULTIPLE_NEW_QUERY).map(toPayload).fnWithMultipleAsyncReturns()
Wenn Sie dasselbe Observable vorab abonnieren möchten, das zurückgegeben wird, verwenden Sie einfach
quelle
.map(data => data)
die das Gleiche tun, und sie dann abonnieren, wo immer Sie das Ergebnis erwartendo
jetzt aufgerufen wirdtap
und Sie es in einer Pipe verwenden müssen. Beachten Sie auch , dasstap
mehrere Parameter für verschiedene Handler wie nimmtnext
,complete
underror
.Sieht so aus, als würden Sie nach einem "aktuellen Wert" in einem Observablen suchen, wenn er emittiert und nach einer Emission.
Subject
undObservable
hat so etwas nicht. Wenn ein Wert ausgegeben wird, wird er an seine Abonnenten übergeben und dasObservable
ist damit erledigt.Sie können verwenden,
BehaviorSubject
welche den zuletzt ausgegebenen Wert speichert und ihn sofort an neue Abonnenten ausgibt.Es gibt auch eine
getValue()
Methode, um den aktuellen Wert abzurufen.Weiterführende Literatur:
RxJS BehaviorSubject
Wie erhalte ich den aktuellen Wert von RxJS Subject oder Observable?
quelle
Beobachtbare Werte können von jedem Ort abgerufen werden. Die Source - Sequenz wird zuerst geschoben auf einen speziellen Beobachter , die an anderer Stelle zu emittieren vermögen. Dies wird mit der Subject-Klasse aus den Reactive Extensions (RxJS) erreicht.
Speichern Sie den Wert auf dem Beobachter .
Um den Wert von einer anderen Stelle abzurufen, abonnieren Sie den Beobachter wie folgt:
Die Probanden sind sowohl Observable als auch Observer. Es gibt noch andere Fach Typen wie BehaviourSubject und ReplaySubject für andere Nutzungsszenarien.
Vergessen Sie nicht, RxJS zu importieren.
quelle
Während die vorherigen Antworten möglicherweise auf eine Art und Weise funktionieren, denke ich, dass die Verwendung von BehaviorSubject der richtige Weg ist, wenn Sie weiterhin Observables verwenden möchten.
Beispiel:
Im Dienste:
In component.ts:
Ich hoffe das hilft!
quelle
Zum Beispiel ist dies meine HTML-Vorlage:
Dies ist das Feld, das mit der Vorlage aus meiner Komponente verknüpft wurde:
Ich rufe Genres von Filmen dynamisch vom Server ab. Um mit dem von mir erstellten Server zu kommunizieren
FilmService
Dies ist die Methode, mit der der Server kommuniziert wird:
Warum gibt diese Methode
Observable<Genre[]>
nicht so etwas zurückGenre[]
?JavaScript ist
async
und wartet nicht darauf, dass eine Methode nach einem teuren Prozess einen Wert zurückgibt. Mit teuer meine ich einen Prozess, dessen Rückgabe einige Zeit in Anspruch nimmt. Wie das Abrufen von Daten vom Server. Sie müssen also die Referenz von Observable zurückgeben und abonnieren.Zum Beispiel in meiner Komponente:
quelle
Im obigen Fall wird console.log ausgeführt, bevor das Versprechen aufgelöst wird, sodass kein Wert angezeigt wird. Ändern Sie ihn in den folgenden
Eine andere Lösung besteht darin, dass Sie Daten in getValueFromObservable benötigen, um den beobachtbaren Operator using zurückzugeben und die Funktion zu abonnieren.
quelle
In der asynchronen, vielversprechungsorientierten, reaktiv-trendigen Welt von Javascript mit einem Thread
async/await
ist der beste Freund des Programmierers im imperativen Stil:Und für den Fall
store
ist eine Folge von mehreren Werten:quelle
Der vernünftige Weg wäre, das Observable von einer Funktion zurückzugeben und es zu abonnieren, wo immer dies erforderlich ist, da Observables faul sind und erst dann Werte ausgeben, wenn sie abonniert sind.
Hier habe ich eine weitere interessante ereignisgesteuerte Lösung, mit der ich ursprünglich herumgespielt habe. Das folgende Beispiel verwendet dazu das Modul " events " von nodejs. Sie können es mit anderen Frameworks verwenden, in denen ein ähnliches Modul vorhanden ist ( Hinweis : Syntax und Stil können sich je nach verwendetem Modul ändern).
Es ist nur ein Beispiel, um eine Idee zu präsentieren, bei der wir Daten von verschiedenen Orten durch Senden und Abhören übertragen können. Dies wird auch als ereignisgesteuerter Code bezeichnet.
quelle