2017-07-25 64 views
1

由于订阅功能和forEach,我使用循环来检索存储在Firebase中的数据。当我在订阅(“=== SUBSCRIBE ===”)中执行我的数据的console.log时,我获得了很好的结果,但是当我在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; 
    } 

在此先感谢

+0

不确定。一旦确定'this''反对当前课程或不在'subscribe'之外。 – SaiUnique

回答

0

这里的问题,即this.statut.subscribe(statut => {})是asyncronous功能。

您的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; 

    }); 
} 
+0

谢谢,但函数返回void:/ –

1

评论:这是边界确切的重复,但问题的后半部分不是,因此是一个答案。

假设这是异步的,并且如How do I return the response from an Observable/http/async call in angular2?所示,您需要处理回调中的所有内容(subscribe)。但是,在这里你想要返回响应。你不能那样做,如这里所说:https://stackoverflow.com/a/39296015这是不可能从subscribe

你可以做什么,就像在答案中提出的那样,你可以使用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 
    }); 
} 

然后你可以订阅这个观察到的组件和你得到statut值:

成分:

constructor(private service: TodolistService) { } 

ngOnInit() { 
    this.service.statusToShow() 
    .subscribe(statut => this.statut = statut) 
} 

我建议你检查官方http-tutorial。我知道你使用Firebase,但想法是一样的:)

+0

谢谢,我试试这个。我在哪里订阅? –

+0

替换为'this.statut = this.afDB.list('/ statut');':) – Alex

+0

我有我的todolistService(其中是我的statusToShow()函数)和home.ts我想要检索我的数据 –