由于subscribe函数和forEach,我使用循环来检索存储在Firebase中的数据。当我在订阅中执行我的数据的console.log时(" === SUBSCRIBE ===")我得到了很好的结果,但是当我在外面执行console.log时(" === HOME ==="和" ===返回==="),我有这样的结果:
我想这是因为它是异步的,请问如何解决这个问题?
这是我的代码:
statut: FirebaseListObservable<any[]>;
statuts: Array<any> = [];
// Données à enregistrer dans FireBase
dateOfTheDay: string;
dayOfWeek: number;
constructor(public afDB: AngularFireDatabase, public storage: Storage) {
moment.locale('fr');
this.dateOfTheDay = moment().format('L'); // Date au format : 04/07/2017
this.dayOfWeek = moment().day(); // Numéro du jour de la semaine (Ex : 1 pour lundi)
this.statut = this.afDB.list('/statut');
}
statusToShow() {
this.statut.subscribe(statut => {
statut.forEach(s => {
if (this.dateOfTheDay === s.statut_date_tache) {
if (s.statut_id_tache in this.statuts === false) {
this.statuts[s.statut_id_tache] = s;
}
}
});
console.log('=== SUBSCRIBE ===');
console.log(this.statuts);
});
console.log('=== RETURN ===');
console.log(this.statuts);
return this.statuts;
}
提前致谢
答案 0 :(得分:1)
评论:这是边界完全重复,但问题的后半部分不是,因此答案。
你是正确的,假设这是异步的,并且如How do I return the response from an Observable/http/async call in angular2?所示,你需要处理回调内的所有内容(subscribe
)。但是,在这里你要返回响应。你不能这样做,如上所述:https://stackoverflow.com/a/39296015来自subscribe
是不可能的。
你可以做什么,如回答中所示,你可以使用map
然后返回一个observable,如果你想在视图中使用它,你可以订阅或使用async
管道。
从您需要的组件中调用服务中的statusToShow()
并订阅该值:
<强>服务强>
statusToShow() {
return this.afDB.list('/statut').map(statut => {
for(let s of statut) {
if (this.dateOfTheDay === s.statut_date_tache) {
if (s.statut_id_tache in this.statuts === false) {
return localStatuts[s.statut_id_tache] = s;
}
}
}
// return something else if value is not found above
});
}
然后您可以在组件中订阅此observable,并获得statut
值:
<强>组件:强>
constructor(private service: TodolistService) { }
ngOnInit() {
this.service.statusToShow()
.subscribe(statut => this.statut = statut)
}
我建议您查看官方 http-tutorial 。我知道你使用的是Firebase,但想法是一样的:)
答案 1 :(得分:0)
问题在于,this.statut.subscribe(statut => {})
是一个异步函数。
在订阅回调未完成时,此功能外的console.log()
已执行。你可以这样做:
statusToShow() {
let localStatuts: Array<any>
this.statut.subscribe(statut => {
statut.forEach(s => {
if (this.dateOfTheDay === s.statut_date_tache) {
if (s.statut_id_tache in this.statuts === false) {
localStatuts[s.statut_id_tache] = s;
}
}
});
console.log('=== SUBSCRIBE ===');
console.log(localStatuts);
this.statuts = localStatuts;
return localStatuts;
});
}