首页 文章

Angular方法返回为undefined而不是JSON对象

提问于
浏览
0

我在身份验证提供程序中有一个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检索用户对象 . 它使用console.log正确输出,只要它存在并保存在toReturn变量中 .

下面是ItemDetailPage类,但是当我记录相同方法的值时,它返回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');
  }

}

我是Angular的新手并且在我继续学习的过程中尝试学习,所以这可能很简单,我错过了 . 但是,为什么JSON对象不会被返回/传回?我需要它来利用从数据库中查询的值 .

谢谢

1 回答

  • 1

    您缺少的是Firebase方法同时运行 . 因此,它确实返回了一个承诺而不是一个值 . 这就是你将返回值作为回调的原因 .

    您应该做的是:在您的服务中返回firebase承诺(或者在您将数据返回控制器之前想要对数据执行某些操作的新承诺) . 然后你想在控制器中创建一个回调函数 .

    return firebase.database().ref('/userProfile').orderByKey().equalTo(uid).once("value", function(snapshot){});
    
    // Controller
    
    _auth.getUser(this.navParams.get('item')).then(function(snapshot){
        ...
    });
    

    你应该看看promises如何在普通的javascript中工作:

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

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

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

相关问题