2017-07-04 68 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