Comment renvoyer la valeur de la fonction qui a un abonnement Observable à l’intérieur?

Je ne sais pas comment extraire la valeur de Observable pour être retourné par la fonction dans laquelle Observable est présent. Je n’ai besoin que d’une valeur 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 retourner la valeur, puis:

 function getValueFromObservable() { this.store.subscribe( (data:any) => { return data } ) } console.log(getValueFromObservable()) 

Que fais-je mal ici?

Je me rends compte que cette Question était il y a pas mal de temps et que vous avez sûrement une solution correcte à ce jour, mais pour ceux qui le recherchent, je suggère de la résoudre avec une promesse de conserver le modèle asynchrone. Une version plus verbeuse créerait une nouvelle promesse:

 function getValueFromObservable() { return new Promise(resolve=>{ this.store .take(1) //useful if you need the data once and don't want to manually cancel the subscription again .subscribe( (data:any) => { console.log(data; resolve(data); }) } } 

À la réception, vous devrez alors “attendre” la promesse de résoudre avec quelque chose comme ceci:

 getValueFromObservable() .then((data:any)=>{ //... continue with anything depending on "data" after the Promise has resolved }) 

Une solution plus mince consisterait plutôt à utiliser RxJS ‘.toPromise ():

 function getValueFromObservable() { return this.store .take(1) .toPromise() } 

Le côté récepteur rest le même que ci-dessus, bien sûr. J’espère que cela pourra aider!

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 object (quelque chose que vous allez utiliser dans votre composant)

 export class MyComponent { name: ssortingng = ""; } 

Un Service vous retournera alors un object Observable :

 getValueFromObservable():Observable { return this.store.map(res => res.json()); } 

Component doit se préparer pour pouvoir en extraire une valeur:

 OnInit(){ this.yourServiceName.getValueFromObservable() .subscribe(res => this.name = res.name) } 

Vous devez atsortingbuer une valeur d’un Observable à une variable:

Et votre modèle consumra le name variable:

 
{{ name }}

Une autre façon d’utiliser Observable est d’utiliser async pipe http://briantroncone.com/?p=623

Note : Si ce n’est pas ce que vous demandez, veuillez mettre à jour votre question avec plus de détails

Si vous souhaitez vous abonner à la même Observable qui sera renvoyée, utilisez simplement

.faire():

 function getValueFromObservable() { return this.store.do( (data:any) => { console.log("Line 1: " +data); } ); } getValueFromObservable().subscribe( (data:any) => { console.log("Line 2: " +data) } ); 

Les valeurs observables peuvent être récupérées à partir de n’importe quel emplacement. La séquence source est d’abord transmise à un observateur spécial capable d’émettre ailleurs. Ceci est réalisé avec la classe Subject des extensions réactives (RxJS).

 var subject = new Rx.AsyncSubject(); // store-last-value method 

Conservez la valeur sur l’ observateur .

 subject.next(value); // store value subject.complete(); // publish only when sequence is completed 

Pour récupérer la valeur d’ailleurs, abonnez-vous à l’observateur comme suit:

 subject.subscribe({ next: (response) => { //do stuff. The property name "response" references the value } }); 

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.

 var Rx = require('rxjs'); 

Le problème est que les données sont capturées à l’intérieur de l’observable et que je peux simplement les consigner. Je veux retourner cette valeur et console.log ou autre fichier différent en appelant la fonction dans laquelle elle réside.

On dirait que vous cherchez un getter de “valeur actuelle” dans une observable, quand il émet et après une émission.

Subject et Observable n’a pas une telle chose. Lorsqu’une valeur est émise, elle est transmise à ses abonnés et l’ Observable est terminé.

Vous pouvez utiliser BehaviorSubject qui stocke la dernière valeur émise et l’émet immédiatement aux nouveaux abonnés.

Il a également une méthode getValue() pour obtenir la valeur actuelle;

Lectures complémentaires:

RxJS BehaviorSubject

Comment obtenir la valeur actuelle de l’object RxJS ou Observable?

Par exemple, ceci est mon modèle HTML:

  

C’est le champ qui est lié au template de mon composant:

  // Genres of films like action or drama that will populate dropdown list. genres: Genre[]; 

Je récupère les genres de films du serveur dynamicment. Pour communiquer avec le serveur, j’ai créé FilmService

C’est la méthode qui communique avec le serveur:

  fetchGenres(): Observable { return this.client.get(WebUtils.RESOURCE_HOST_API + 'film' + '/genre') as Observable; } 

Pourquoi cette méthode renvoie Observable pas quelque chose comme Genre[] ?

JavaScript est async et n’attend pas qu’une méthode retourne une valeur après un processus coûteux. J’entends par cher un processus qui prend du temps pour retourner de la valeur. Comme chercher des données du serveur. Vous devez donc renvoyer la référence de Observable et vous y abonner.

Par exemple dans mon composant:

 ngOnInit() { this.filmService.fetchGenres().subscribe( val => this.genres = val ); }