我正在创建一个测试应用程序,它在firebase上托管了1000个问题。为了防止多次下载问题,我已经实现了一个问题服务,在构造函数中我下载了问题:
this.db.list("questions/", { preserveSnapshot: true}).subscribe(snapshots => {...}
这会下载问题并将它们推送到问题数组,这样我就不必在下一个会话之前重新下载。我也有提供问题的功能:
getQuestion(){
return this.questions[0];
}
但是,由于firebase的异步性质,通常在调用getQuestion()
之前尚未下载数据,因此它返回undefined。
是否有正确的方法在angular中实现此数据存储类型模式,并确保在调用getQuestion()
之前构造函数中的异步调用完成?
我尝试添加变量ready
,将其初始化为false,并在异步调用返回时将其设置为true。然后,getQuestions()
被修改为:
getQuestion(){
while(!this.ready()){}
return this.questions[0];
}
然而,这只会导致应用程序挂起。
答案 0 :(得分:1)
几乎没有必要使用preserveSnapshot
。不必担心快照是使用AngularFire的主要好处之一。只需写下this.db.list(PATH).subscribe(list =>
即可。
你感到困惑"下载"用"订阅"。订阅服务并在本地存储数据几乎不是一个好主意 - 您将永远无法确定订阅处理程序何时运行,如您所见。
相反,服务应该提供一个可观察的消费者 - 通常是组件 - 将消费。那些消费者可以订阅observable并做任何他们想做的事情,包括静态存储数据,或者,最好,你可以使用async
管道直接在模板中订阅observable。
一般规则是尽可能晚地订阅 - 最好是在模板中订阅。将您的代码编写为一组可映射的,您可以映射,过滤和组合。
Firebase缓存结果,一般而言,您不必担心自己缓存。
答案 1 :(得分:0)
下载getQuestion()
数据后调用FireBase
功能。
使用吹码:
this.db.list("questions/").subscribe(list => {...} //etc