Angular 显示订阅的异步数据

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[]>;

由于subscribe函数和forEach,我使用一个循环来检索存储在Firebase中的数据。当我在subscribe(“==subscribe==”)中对我的数据执行console.log时,我得到了很好的结果,但是当我在subscribe(“==HOME==”和“==RETURN==”)之外执行console.log时,我得到了以下结果:

我想这是因为它是异步的,请问如何解决这个问题

这是我的代码:

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…
代码还是我完全误解了?我的服务:,很好?我想在家里得到我的数据