2017-07-04 76 views
0

我正在創建一個測試應用程序,其中包含1000個託管在Firebase上的問題。爲了防止多次下載的問題,我已經實現了一個問題,服務地方在構造函數中我下載的問題:角度4異步數據存儲

this.db.list("questions/", { preserveSnapshot: true}).subscribe(snapshots => {...} 

此下載的問題,並將其推到一個問題陣列,這樣我就不必重新下載,直到下一個會話。我也有一個功能,以服務問題:

getQuestion(){ 
    return this.questions[0]; 
} 

然而,由於火力的異步性,很多時候數據尚未getQuestion()之前下載的調用,因此它返回undefined。

有沒有適當的方式來實現這種數據存儲類型模式的角度,並確保異步調用在構造函數完成調用getQuestion()之前完成?

我試着添加一個變量ready,將它初始化爲false,並在異步調用返回時將其設置爲true。然後,getQuestions()被修改的樣子:

getQuestion(){ 
    while(!this.ready()){} 
    return this.questions[0]; 
} 

然而,這只是導致應用程序掛起。

回答

1

幾乎沒有必要使用preserveSnapshot。不必擔心快照是使用AngularFire的主要好處之一。只需寫this.db.list(PATH).subscribe(list =>

你很迷惑「下載」與「訂閱」。在服務中訂閱並且在本地存儲數據幾乎永遠不是一個好主意 - 你永遠不會確切地確定訂閱處理程序運行的時間,就像你發現的那樣。

相反,該服務應該提供一個可觀察的消費者 - 通常是組件 - 將消費的。這些消費者可以訂閱observable並執行他們想要的任何操作,包括靜態存儲數據,或者,最好可以使用async管道直接在模板內訂閱observable。

一般規則是儘可能晚地訂閱 - 理想情況下在模板中。將您的代碼編寫爲一組您可以映射並過濾和撰寫的可觀察項。

Firebase緩存結果,一般而言,您無需擔心自行緩存。

0

FireBase下載數據後調用getQuestion()函數。 使用吹碼:

this.db.list("questions/").subscribe(list => {...} //etc