2016-11-14 3 views
0


В моем компоненте я вызываю функцию у поставщика услуг. Вызов функции get из Firebase и то, что я получаю в консоли, - это ZoneAwarePromise. Что я делаю не так?Получение ZoneAwarePromise из значения моментального снимка Firebase

В xx.component.ts файле:

constructor(private db: Database) { 

    console.log(db.getActiveUserData()); 

} 

database.ts файл:

getActiveUserData(){ 
    return this.database.child('/users/' + this.as.id).once('value').then((snapshot) => { 
     return snapshot.val(); 
    }) 
} 

консоли журнала:

ZoneAwarePromise __zone_symbol__state: истинный

__zone_symbol__value : Объект Firstname : Фредрик UID : "zLmRHwQRM0cehsSrGNXaH2WnSgk2"

прото : Объект прото : Объект

Как получить данные, как равнина объект?

Когда я использую журнал консоли внутри database.ts, его все в порядке

+1

Вы не можете сделать в реальном времени, асинхронные операции в синхронных возвращаемых значений. Вам нужно будет использовать их асинхронно, передать обещание и дождаться его разрешения (поместите консоль.log() внутри .then(), например 'db.getActiveUserData(), затем (console.log) ' – Kato

ответ

1

То, что вы видите, это ожидаемое поведение.

once возвращает обещание, так вот что возвращается getActiveUserData. Вы не можете вернуть значение моментального снимка. Тем не менее, вы можете получить возвращенный обещание разрешить к стоимости снимка,:

getActiveUserData() { 

    return this.database 
    .child('/users/' + this.as.id) 
    .once('value') 
    .then((snapshot) => snapshot.val()); 
} 

Что вы бы назвать так:

@Component({ 
    selector: "some-component", 
    template: `<code>{{ activeUserData | json }}</code>` 
}) 
class SomeComponent { 

    activeUserData: any; 

    constructor(private db: Database) { 

    db.getActiveUserData().then((val) => { this.activeUserData = val; }); 
    } 
} 

Угловые шаблоны понять обещания, поэтому данные могут быть сохранены в качестве обещаю и async трубы могут быть использованы:

@Component({ 
    selector: "some-component", 
    template: `<code>{{ activeUserData | async | json }}</code>` 
}) 
class SomeComponent { 

    activeUserData: Promise<any>; 

    constructor(private db: Database) { 

    this.activeUserData = db.getActiveUserData(); 
    } 
} 
+0

Это помогает! Но как установить« val »в переменную? Как this.activeuser = val. –

+0

Я обновил ответ. Однако вы можете узнать больше о обещаниях, есть много материала доступно: [promjs.org] (https://www.promisejs.org/), [JavaScript Promises: введение] (https://developers.google.com/web/fundamentals/getting-started/primers/promises) – cartant

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