Angular 方法 returns 未定义而不是 JSON 对象

Angular method returns as undefined rather than JSON object

我在身份验证提供程序中有一个 getUser 方法(在 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;
      }

它从 firebase 检索用户对象。 如果它存在并保存在 toReturn 变量中,它会使用 console.log 正确输出。

下面是 ItemDetailPage class 但是当我记录相同方法的值时,它 returns 未定义。

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');
  }

}

我是 Angular 的新手,正在努力学习,所以这可能是我错过的非常简单的事情。但是,为什么 JSON 对象没有得到 returned/passed 呢?我需要它来利用从数据库中查询的值。

谢谢

您缺少的是 Firebase 方法是 运行 assincronously。因此,它 return 是一个承诺而不是一个值。这就是为什么你得到 returned 值作为回调。

您应该做的是:return 您服务中的 firebase 承诺(或者如果您想在 return 将数据发送到控制器之前对数据执行某些操作,则需要一个新承诺)。然后你想在控制器中创建一个回调函数。

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

// Controller

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

你应该看看 promise 在普通 javascript:

中是如何工作的

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

然后是如何在 NG2 风格中使用它们

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