Je ne sais pas comment extraire la valeur d'Observable pour qu'elle soit renvoyée par la fonction dans laquelle Observable est présent. J'ai juste besoin d'une valeur de celui-ci pour être retourné, rien d'autre.
Version actuelle qui fonctionne
function getValueFromObservable() {
this.store.subscribe(
(data:any) => {
console.log(data)
}
)
}
getValueFromObservable()
J'ai besoin de cela pour fonctionner, fonction pour renvoyer la valeur, puis:
function getValueFromObservable() {
this.store.subscribe(
(data:any) => {
return data
}
)
}
console.log(getValueFromObservable())
Qu'est-ce que je fais de mal ici?
typescript
angular
rxjs
rxjs5
Teddy
la source
la source
subscribe
Réponses:
EDIT: code mis à jour afin de refléter les modifications apportées au fonctionnement des tuyaux dans les versions plus récentes de RXJS. Tous les opérateurs (prenons mon exemple) sont maintenant enveloppés dans l'opérateur pipe ().
Je me rends compte que cette question remonte à un certain temps et que vous avez sûrement une solution appropriée maintenant, mais pour tous ceux qui recherchent cela, je suggérerais de la résoudre avec une promesse de garder le modèle asynchrone.
Une version plus verbeuse créerait une nouvelle promesse:
À la réception, vous devrez alors «attendre» que la promesse se résout avec quelque chose comme ceci:
Une solution plus mince consisterait à utiliser .toPromise () de RxJS à la place:
Le côté récepteur reste bien sûr le même que ci-dessus.
la source
getValueFromObservable
fonction?Ce n'est pas exactement l'idée correcte d'utiliser
Observable
Dans le composant, vous devez déclarer un membre de classe qui contiendra un objet (quelque chose que vous allez utiliser dans votre composant)
Ensuite, vous
Service
serez renvoyé unObservable
:Component
devrait se préparer pour pouvoir en récupérer une valeur:Vous devez attribuer une valeur de an
Observable
à une variable:Et votre modèle consommera la variable
name
:Une autre façon d'utiliser
Observable
est via leasync
tuyau http://briantroncone.com/?p=623Remarque : si ce n'est pas ce que vous demandez, veuillez mettre à jour votre question avec plus de détails
la source
name
disponible en dehors du rappel en l'attribuant à laname
variable du composant . Il n'est pas possible de revenir de manièrename
synchrone dans votre cas.Oninit
comme ça, que faire si je dois revenir explicitement, mon code d'appel ressemble à cecithis.actions$.ofType(SearchActions.SEARCH_MULTIPLE_NEW_QUERY).map(toPayload).fnWithMultipleAsyncReturns()
Si vous souhaitez vous préinscrire au même Observable qui vous sera retourné, utilisez simplement
la source
.map(data => data)
qui fait la même chose, puis vous abonner là où vous attendez le résultatdo
est maintenant appelétap
et vous devez l'utiliser dans un tube. Notez également quetap
prend plusieurs paramètres pour différents gestionnaires tels quenext
,complete
eterror
.On dirait que vous cherchez un getter "valeur courante" à l'intérieur d'un observable, quand il émet et après une émission.
Subject
etObservable
n'a pas une telle chose. Lorsqu'une valeur est émise, elle est transmise à ses abonnés et en aObservable
terminé avec elle.Vous pouvez utiliser
BehaviorSubject
qui stocke la dernière valeur émise et l'émet immédiatement aux nouveaux abonnés.Il a également une
getValue()
méthode pour obtenir la valeur actuelle;Lectures complémentaires:
RxJS BehaviorSubject
Comment obtenir la valeur actuelle de RxJS Subject ou Observable?
la source
Les valeurs observables peuvent être récupérées à partir de n'importe quel emplacement. La séquence source est d'abord poussée sur un observateur spécial capable d'émettre ailleurs. Ceci est réalisé avec la classe Subject des extensions réactives (RxJS).
Stockez la valeur sur l' observateur .
Pour récupérer la valeur ailleurs, abonnez-vous à l'observateur comme ceci:
Les sujets sont à la fois des observables et des observateurs. Il existe d'autres types de sujets tels que BehaviourSubject et ReplaySubject pour d'autres scénarios d'utilisation.
N'oubliez pas d'importer RxJS.
la source
Bien que les réponses précédentes puissent fonctionner d'une certaine manière, je pense que l'utilisation de BehaviorSubject est la bonne façon si vous souhaitez continuer à utiliser des observables.
Exemple:
Dans le service:
Dans component.ts:
J'espère que ça aide!
la source
Par exemple, voici mon modèle html:
Voici le champ lié au modèle de mon composant:
Je récupère les genres de films du serveur de manière dynamique. Afin de communiquer avec le serveur que j'ai créé
FilmService
C'est la méthode qui communique le serveur:
Pourquoi cette méthode
Observable<Genre[]>
ne renvoie pas quelque chose commeGenre[]
?JavaScript est
async
et n'attend pas qu'une méthode retourne de la valeur après un processus coûteux. Avec cher, je veux dire un processus qui prend du temps à retourner de la valeur. Comme récupérer des données sur le serveur. Vous devez donc renvoyer la référence d'Observable et vous y abonner.Par exemple dans mon composant:
la source
Dans le cas ci-dessus, console.log s'exécute avant que la promesse ne soit résolue, donc aucune valeur ne s'affiche, changez-le en suivant
Une autre solution est lorsque vous avez besoin de données dans getValueFromObservable pour renvoyer l'observable à l'aide de l'opérateur of et vous abonner à la fonction.
la source
Dans le monde de javascript à un seul thread, asynchrone, orienté promesse et réactif, se
async/await
trouve le meilleur ami du programmeur de style impératif:Et au cas où il
store
y aurait une séquence de plusieurs valeurs:la source
La manière décente serait de renvoyer l'observable à partir d'une fonction et de s'y abonner partout où cela est nécessaire, car les observables sont paresseux, ils ne commenceront à émettre des valeurs que lorsqu'ils seront abonnés.
Ici, j'ai une autre solution événementielle intéressante, avec laquelle j'ai d'abord joué. L'exemple suivant fait cela en utilisant le module " events " de nodejs. Vous pouvez l'utiliser avec d'autres frameworks où un module similaire existe ( Remarque : la syntaxe et le style peuvent changer en fonction du module utilisé).
C'est juste un exemple pour présenter une idée où nous pouvons transmettre des données de différents endroits par une méthode d'émission et d'écoute. Ceci est également connu sous le nom de code événementiel.
la source