2017-07-25 66 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我想要檢索我的數據 –