显示订阅

时间:2017-07-25 13:59:43

标签: angular typescript firebase asynchronous ionic-framework

由于subscribe函数和forEach,我使用循环来检索存储在Firebase中的数据。当我在订阅中执行我的数据的console.log时(" === SUBSCRIBE ===")我得到了很好的结果,但是当我在外面执行console.log时(" === HOME ==="和" ===返回==="),我有这样的结果:

screen of 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;
  }

提前致谢

2 个答案:

答案 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;

  });
}