web-dev-qa-db-fra.com

Comment retourner la valeur d'une fonction qui a un abonnement Observable à l'intérieur?

Je ne sais pas comment extraire la valeur de Observable pour qu'elle soit renvoyée par la fonction dans laquelle Observable est présent. J'ai juste besoin 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 ça pour fonctionner, pour retourner une valeur, puis:

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

Qu'est-ce que je fais mal ici?

62
Teddy

Je me rends compte que cette question remonte à il y a un certain temps et que vous avez sûrement une solution appropriée à l'heure actuelle, mais pour tous ceux qui le recherchent, je suggérerais de la résoudre avec la promesse de conserver le modèle asynchrone. Une version plus détaillée 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);
         })
    }
}

Sur le destinataire, vous devrez alors "attendre" que la promesse soit résolue avec quelque chose comme ceci:

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

Une solution plus fine utiliserait plutôt le fichier .toPromise () de RxJS:

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

Le côté receveur reste bien sûr le même que ci-dessus. J'espère que ça t'as aidé!

28
jparg

Ce n’est pas une idée exacte de l’utilisation de Observable

Dans le composant, vous devez déclarer un membre de la classe qui contiendra un objet (quelque chose que vous allez utiliser dans votre composant)

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

Alors un Service vous retournera un Observable:

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

Component devrait se préparer à pouvoir en récupérer une valeur:

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

Vous devez affecter une valeur d'un Observable à une variable:

Et votre modèle consommera la variable name:

<div> {{ name }} </div>

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

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

16
Andrei Zhytkevich

Si vous souhaitez vous pré-abonner au même Observable qui vous sera renvoyé, 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)
        }
    );
7
Dudi

Le problème est que les données sont capturées à l'intérieur de l'observable et que je peux simplement les consigner par console. Je veux renvoyer cette valeur et console.log ou ce que ce soit à partir d'un fichier différent en appelant la fonction dans laquelle il réside.

On dirait que vous recherchez un "valeur actuelle" dans un observable, quand il émet et après une émission.

Subject et Observable ne possède pas une telle chose. Lorsqu'une valeur est émise, elle est transmise à ses abonnés et la Observable en est complétée.

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 RxJS Subject ou Observable?

5
A. Alencar

Les valeurs observables peuvent être extraites 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).

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

Stocker la valeur sur l'observateur .

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

Pour récupérer la valeur ailleurs, abonnez-vous à l'observateur de la manière suivante:

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

Les sujets sont à la fois observables et observateurs. Il existe d'autres types d'objet , tels que BehaviourSubject et ReplaySubject pour d'autres scénarios d'utilisation.

N'oubliez pas d'importer RxJS.

var Rx = require('rxjs');
1
Pageii Studio