Угловой метод возвращается как неопределенный, а не как объект 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 не возвращается и не возвращается? Мне нужно, чтобы они использовали значения, запрашиваемые из базы данных.

благодаря

  • 0
    Вы должны использовать лямбда-синтаксис (снимок) => {} вместо функции (снимок) {}. См., Если это работает.
Теги:
firebase
ionic-framework
ionic2
firebase-realtime-database

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){
    ...
});

Вы должны взглянуть на то, как обещают работать в простом javascript:

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

И тогда, как они используются в стиле NG2

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

  • 0
    Получил работу Спасибо за ссылки, прочту их!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню