0

У меня есть метод GetUser внутри провайдера аутентификации (работающий в ионического 2):Угловой метод возвращает, как не определено, а не объект JSON

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

} 

Я новичок в Угловое и пытается узнать, как я иду вперед, так что это, вероятно, что-то довольно просто я пропускаю. Однако почему объект JSON не возвращается и не возвращается? Мне нужно, чтобы они использовали значения, запрашиваемые из базы данных.

Благодаря

+0

Вы должны использовать лямбда-синтаксис (моментальный снимок) => {} вместо функции (моментальный снимок) {} .see, если он работает. – Ajay

ответ

1

Что вам не хватает в том, что метод Firebase работает assincronously. Таким образом, он возвращает обещание вместо ценности. Вот почему вы получаете возвращаемое значение в качестве обратного вызова.

Что вам нужно сделать: вернуть обещание 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

Выполнение поставленной задачи. Спасибо за ссылки, дадут им прочитать! – Kyanite

Смежные вопросы