结合使用Rxjs和Firebase(角度5)

时间:2018-08-09 06:50:46

标签: angular firebase rxjs

由于我正在使用angular / firebase,因此我对Rxjs与Angular 2+上的firebase的良好使用感到困惑,尤其是与带firebase.on / once的Observable / Subject一起使用时。我没有找到很好的例子。

首先,我认为我对每个人的理解都是可以的(合并它们时我很困惑),不确定我的解释:

  • 主题:数据生产者和数据消费者,订阅该主题的可观察对象将像“依赖对象”
  • 可观察:数据生产者,数据将更加“独立”
  • firebase.database()。ref(...)。on ...:每次数据更改时调用的查询
  • firebase.database()。ref(...)。一次...:调用一次查询

一些我所看到的问题/例子(使我感到困惑):

  • 在Observable中使用“ firebase.database()。ref(..)。once ...”(或.on):如果查询已经满足我们的需要,在此处使用Observable有什么意义?
  • 什么时候更好地使用Subject> Observable + setter更新“我自己”数据?
  • 假设您有/ books,并且每本书都有一些属性(id,作者,页面,书名...)(在您的代码中,它将存储在Book []中),并且您想更新例如author最好只更新此属性或使用firebase(firebase.database()。ref('/ books')。set(this.books);)更新所有书籍?我不知道为什么,但是我觉得仅更新属性比所有对象更安全,但是我经常看到使用所有对象进行更新,最好的方法是什么?
  • (编辑)将firebase.database()。on ...与Subjects一起使用有什么意义?一次将给出相同的结果,并且将获得最佳(更少的查询)否?

1 个答案:

答案 0 :(得分:1)

我将一一回答您的问题:

如果查询已经提供了我们所需要的东西,那么使用Observables有什么意义呢?

我认为要注意的最重要的一点是,可观察变量很冷,这意味着您可以创建复杂的数据流,直到有人订阅了该数据流,它们才会被执行,这与查询不同,查询是在创建时立即执行的

Observables还允许查询关联,查询之间的依赖关系(例如,成为朋友的朋友)。此外,Observables提供了一种侦听数据更改并在每次更改时重复相同行为的简单方法。

何时使用“可观察者+设置者”上的主题来更新“我自己”的数据更好?

这个答案很简单:总是。由于Firebase是实时的,因此您应该在此之后执行所有操作,并保持异步。同样,Subject扩展了ObservableSubject本质上是一个Observable,它公开了其emit方法,允许您在其上发射自定义数据。

更新对象内部属性的最佳方法是什么?

为此,我完全鼓励您在Firebase上使用Firestore,原因很简单:定价(也由于数据模型tbh)。 Firestore是一个文档数据库,您的用例完全是一个文档数据库。它比firebase便宜,因为它可以扩展查询量,而不是像firebase那样传输数据。

另外,对整个对象进行udpat处理在实现方面更简单,并且需要较少的查询(如果您使用的是Firestore,则必须更新整个对象,因为它不是像Firebase这样的巨型对象数据库),但是它具有一个简单的缺陷:如果用户A更新了给定的书作者姓名,而用户B更新了同一本书,但仅是书名,那么使用同一对象可能会导致最后一个查询覆盖另一本书,但这是非常罕见的竞争条件,我我不确定您应该考虑一一更新字段的代价。