Angular 显示订阅的异步数据
由于subscribe函数和forEach,我使用一个循环来检索存储在Firebase中的数据。当我在subscribe(“==subscribe==”)中对我的数据执行console.log时,我得到了很好的结果,但是当我在subscribe(“==HOME==”和“==RETURN==”)之外执行console.log时,我得到了以下结果: 我想这是因为它是异步的,请问如何解决这个问题 这是我的代码:Angular 显示订阅的异步数据,angular,typescript,firebase,asynchronous,ionic-framework,Angular,Typescript,Firebase,Asynchronous,Ionic Framework,由于subscribe函数和forEach,我使用一个循环来检索存储在Firebase中的数据。当我在subscribe(“==subscribe==”)中对我的数据执行console.log时,我得到了很好的结果,但是当我在subscribe(“==HOME==”和“==RETURN==”)之外执行console.log时,我得到了以下结果: 我想这是因为它是异步的,请问如何解决这个问题 这是我的代码: statut: FirebaseListObservable<any[]>;
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;
}
statut:FirebaseListObservable;
statuts:Array=[];
//唐娜·恩雷吉斯特·丹斯火场
日期:字符串;
dayOfWeek:数字;
构造器(公共afDB:AngularFireDatabase,公共存储:存储){
地点('fr');
this.dateofday=moment().format('L');//日期au格式:2017年7月4日
this.dayOfWeek=moment().day();///Numéro du jour de la semaine(例如:1 pour lundi)
this.statut=this.afDB.list('/statut');
}
statusToShow(){
this.statut.subscribe(statut=>{
法定汇率(s=>{
如果(this.dateofday===s.statut\u date\u环节){
如果(此中的s.statuts\u id\u链接。statuts===false){
this.statuts[s.statutt\u id\u tache]=s;
}
}
});
console.log('==SUBSCRIBE==');
console.log(this.statuts);
});
log('==RETURN===');
console.log(this.statuts);
把这个还给我;
}
提前感谢这里的问题是,
this.statut.subscribe(statut=>{})
是一个异步函数
此函数之外的console.log()
s已在订阅回调未完成时执行。您可以这样做:
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;
});
}
statusToShow(){
让localStatuts:Array
this.statut.subscribe(statut=>{
法定汇率(s=>{
如果(this.dateofday===s.statut\u date\u环节){
如果(此中的s.statuts\u id\u链接。statuts===false){
localStatuts[s.statutt\u id\u tache]=s;
}
}
});
console.log('==SUBSCRIBE==');
log(localStatuts);
this.statuts=本地statuts;
返回本地状态;
});
}
注释:这是一个近乎完全重复的问题,但问题的后半部分不是,因此是一个答案
假设这是异步的,您是正确的,正如本文所示,您需要处理回调(订阅
)中的所有内容。但是,这里您想要返回响应。您不能这样做,正如这里所说:从订阅是不可能的
您所能做的,如回答中所示,您可以使用map
,然后返回一个可观察对象,如果您想在视图中使用它,您可以订阅或使用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
});
}
constructor(private service: TodolistService) { }
ngOnInit() {
this.service.statusToShow()
.subscribe(statut => this.statut = statut)
}
然后,您可以在组件中订阅此可观察值,并获得statut
值:
组件:
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
});
}
constructor(private service: TodolistService) { }
ngOnInit() {
this.service.statusToShow()
.subscribe(statut => this.statut = statut)
}
我建议你查一下官方的。我知道您正在使用Firebase,但想法是一样的:)不确定。一旦确保此
引用当前类或不在订阅
之外。谢谢,但函数return void:/谢谢,我尝试了这个。我将订阅放在哪里?将其替换为this.statut=this.afDB.list('/statut')代码>:)我有我的todolistService(我的statusToShow()函数在哪里)和home.ts,我想在那里检索我的数据对不起,我不明白你的意思:)你想知道把这个放在哪里吗返回这个.status.map…
代码还是我完全误解了?我的服务:,很好?我想在家里得到我的数据