Angular 4异步数据存储

时间:2017-07-04 03:47:54

标签: javascript angular firebase firebase-realtime-database angularfire2

我正在创建一个测试应用程序,它在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];
}

然而,这只会导致应用程序挂起。

2 个答案:

答案 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