#angular #typescript #firebase-realtime-database #es6-promise
#angular #typescript #firebase-realtime-database #es6-обещание
Вопрос:
У меня возникли некоторые проблемы с angular firebase Realtime DB
Я создал функцию в своей службе базы данных, подобную этой :
getAllProject() {
return firebase.database().ref('project').once('value').then((snapshot) => {
if (snapshot.val()) {
const dataObj = snapshot.val();
return dataObj;
}
});
};
что не требует пояснений.
Затем в моем компоненте carousel :
import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
import { DbService } from '../services/db.service';
@Component({
selector: 'app-carousel',
templateUrl: './carousel.component.html',
styleUrls: ['./carousel.component.scss']
})
export class CarouselComponent implements OnInit {
arrayProject;
constructor(private dbService: DbService) {
this.dbService.getAllProject().then((data)=>{
this.arrayProject = data;
console.log("this.arrayProject",this.arrayProject);
//this one is processed in second, result : correct data
});
}
ngOnInit() {
console.log("this.arrayProject 2 : ", this.arrayProject);
//this one is processed in first result : undefinned
}
Я понимаю, что обещание должно быть разрешено перед отображением данных, но в этом случае я вызываю свою службу во время построения компонента, так почему мои данные не определены в ngOnInit() ?
Мне нужно, чтобы эти данные были готовы до инициализации компонента, потому что эти данные будут использоваться для отображения: img, text, ect, в моей карусели.
Ответ №1:
Потому что getAllProject() возвращает обещание, а обратный вызов, который вы указали в .then(), вызывается после ngOnInit. переместите его в ngOnInit
async ngOnInit() {
this.arrayProject = await this.dbService.getAllProject();
console.log("this.arrayProject: ", this.arrayProject);
}
Комментарии:
1. Большое спасибо за ваш ответ, он работает. Не могли бы вы немного подробнее рассказать об асинхронном ngOnInit? Или свяжите меня со статьей, объясняющей это точно?
2. Пожалуйста, отметьте это как принятое, если это было полезно. Это довольно большая тема, но в двух словах ваша функция getAllProject() возвращает ответ типа Promise, который необходимо «развернуть», чтобы получить значение. Поскольку конструктор не может быть асинхронным, вы разворачиваете его с помощью .then(callbackFunc) но в этом случае callbackFunc выполняется после ngOnInit, поэтому мы переместили его в ngOnInit и сказали ему дождаться развернутого значения и только после этого продолжить. Async / await — это «синтаксический сахар» для обещаний. В MDN есть несколько хороших статей developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous /…
3. Спасибо за ваше время, помечено как принятое. Я работаю с angular typescript уже некоторое время, но я все еще борюсь с этими асинхронными операциями, я проверю ссылку.