La méthode angulaire retourne en tant qu'objet non défini plutôt que JSON


Kyanite

J'ai une méthode getUser dans un fournisseur d'authentification (fonctionnant dans Ionic 2):

  getUser(uid: string): any {
    var toReturn;

        firebase.database().ref('/userProfile').orderByKey().equalTo(uid).once("value", function(snapshot){
          toReturn = snapshot.val();
          console.log("getUser = " + JSON.stringify(toReturn));
        });

        return toReturn;
      }

Il récupère un objet utilisateur de Firebase. Il obtient correctement la sortie avec le console.log à condition qu'il existe et qu'il soit enregistré dans la variable toReturn.

Vous trouverez ci-dessous la classe ItemDetailPage, mais lorsque j'enregistre la valeur de la même méthode, elle renvoie undefined.

import { Component } from '@angular/core';
import { NavParams} from 'ionic-angular';
import { Auth } from '../../providers/auth/auth';

@Component({
  templateUrl: 'build/pages/item-detail/item-detail.html',
  providers: [Auth]
})
export class ItemDetailPage {
  private title;
  private description;
  private author;

  constructor(private navParams: NavParams, private _auth: Auth) {
    this.title = this.navParams.get('item').title;
    this.description = this.navParams.get('item').description;
    this.author = _auth.getUser(this.navParams.get('item').author);
    console.log("item-detail.ts = " + JSON.stringify(this.author));
    //_auth.getUser('123');
  }

}

Je suis nouveau sur Angular et j'essaie d'apprendre au fur et à mesure, donc c'est probablement quelque chose d'assez simple que je rate. Cependant, pourquoi l'objet JSON n'est-il pas renvoyé / renvoyé? J'en ai besoin pour utiliser les valeurs interrogées dans la base de données.

Merci

Italo Ayres

Ce qui vous manque, c'est que la méthode Firebase s'exécute de manière assincronale. Donc, il renvoie une promesse au lieu d'une valeur. C'est pourquoi vous obtenez la valeur renvoyée en tant que rappel.

Ce que vous devez faire est de: renvoyer la promesse Firebase dans votre service (ou une nouvelle au cas où vous voudriez faire quelque chose avec les données avant de la renvoyer au contrôleur). Ensuite, vous souhaitez créer une fonction de rappel dans le contrôleur.

return firebase.database().ref('/userProfile').orderByKey().equalTo(uid).once("value", function(snapshot){});

// Controller

_auth.getUser(this.navParams.get('item')).then(function(snapshot){
    ...
});

Vous devriez jeter un œil au fonctionnement des promesses en javascript simple:

http://andyshora.com/promises-angularjs-explained-as-cartoon.html

Et puis comment ils sont utilisés dans le style NG2

http://coenraets.org/blog/2016/02/angular2-ionic2-data-services-promises-observables/

Articles connexes


SQL: retourne la jointure gauche en tant qu'objet

Huit Assez nouveau dans SQL, je suis donc désolé si ce n'est pas possible du tout. J'utilise essentiellement des requêtes SQL pour obtenir des données de ma base de données, puis les transmettre à une API Graphql. Cela a très bien fonctionné jusqu'à présent ca