【问题标题】:Good use of Rxjs with Firebase (angular 5)很好地使用带有 Firebase 的 Rxjs(角度 5)
【发布时间】:2019-01-16 12:50:50
【问题描述】:

由于我正在研究 angular / firebase,我对在 Angular 2+ 上很好地使用 Rxjs 和 firebase 感到有点困惑,尤其是使用带有 firebase.on/once 的 Observable/Subject。我没有找到很好的例子。

首先我认为我对每一个的理解都还可以(我感到困惑的是在组合它们时),不确定我的解释:

  • Subject:一个数据生产者和一个数据消费者,订阅这个subject的observables会像“依赖”一样
  • Observable:数据将更加“独立”的数据生产者
  • firebase.database().ref(...).on...:每次数据更改时都会调用查询
  • firebase.database().ref(...).once...:查询调用一次

我看到的一些问题/示例(这让我很困惑):

  • 在 Observable 中使用“firebase.database().ref(..).once...”(或 .on):如果查询已经为我们提供了我们需要的东西,那么在这里使用 Observable 有什么意义?
  • 什么时候最好使用 Subject 而不是 Observable + setter 来更新“我自己”的数据?
  • 假设您有 /books 并且每本书都有一些属性(id、作者、页面、标题...)(在您的代码中它将存储在 Book[] 中)并且您想要更新例如作者,是吗最好只更新此属性或使用 firebase (firebase.database().ref('/books').set(this.books);) 更新所有书籍?我不知道为什么,但我觉得更新属性比更新所有对象更安全,但我经常看到更新所有对象,最好的方法是什么?
  • (编辑)将 firebase.database().on... 与 Subjects 一起使用有什么意义?一次会给出相同的结果,并且会更优化(更少的查询)不是吗?

【问题讨论】:

  • 您应该考虑使用angularfire2,因为它可以让您使用 Observables 进行所有操作,因此您不必担心所有这些。基本上,get 调用将返回一个 observable,每当您调用 get 的引用更新时,它都会发出一个新值。
  • @Supamiu 我已经尝试过 angularfire,但在键入对象时遇到了一些问题......这并不能解决我的困惑(我认为在使用“工具”之前理解概念是件好事)但是你说得对,我应该坚持并用 angularfire 训练自己!

标签: angular firebase rxjs


【解决方案1】:

我会一一回答你的问题:

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

我认为最需要注意的是 Observables 是冷的,这意味着您可以创建复杂的数据流,它们不会在有人订阅此流之前执行,这与查询不同,查询在您创建时立即执行.

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

什么时候最好使用 Subject 而不是 Observable + setter 来更新“我自己”的数据?

这个问题的答案很简单:总是。因为 firebase 是实时的,所以你应该在这之后做所有事情,让所有事情都异步。此外,Subject 扩展了 ObservableSubject 基本上是一个 Observable,它公开了其 emit 方法,允许您在其上发出自定义数据。

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

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

此外,更新整个对象在实现方面更简单,并且需要更少的查询(如果您使用的是 firestore,则必须更新整个对象,因为它不是像 firebase 这样的大型对象数据库),但它有一个简单的缺陷:如果用户 A 更新给定的书籍作者姓名,而用户 B 更新同一本书但只更新标题,那么使用相同的对象可能会导致最后一个查询覆盖另一个,但这是一个非常罕见的竞争条件,我我不确定您是否应该考虑逐个更新字段的成本。

【讨论】:

  • 感谢您的回答。我认为 Firestore 仅适用于 android,但经过一些搜索 (stackoverflow.com/questions/46549766/…) 后,它看起来很有趣(在我的情况下,我的网络应用程序有很多聊天 = 很多更新,所以我不确定 firestore 会不会更好)而且我将来肯定会带火库!阅读您的答案后,我想我会用 Subjects 升级我的整个项目!我忘了问:使用 firebase.database().on... 和 Subjects 有什么意义?一次会给出相同的结果吗?
  • @Curse 的重点是使用.on 会立即创建一个请求,而不是在订阅时创建一个请求,并且您最终需要在 Observables 中连接它。但同样,angularfire2 为您处理所有事情,我正在创建一个带有 firebase 和 firestore 的 angular 应用程序,并且由于 angularfire2,我可以轻松完成所有事情:)
  • 谢谢。 Angularfire2 看起来确实更容易使用(+ 在大多数情况下不需要使用服务直接在组件中获取数据?)但正如我所说我已经尝试过并且在键入对象时遇到了很多问题,我需要保存它们作为“任何”类型或者我有错误(我认为将我的所有对象保存为任何类型不是一件好事)
  • @Curse 也许这可以帮助你:github.com/Supamiu/ffxiv-teamcraft/tree/staging/src/app/core/… 它一点也不完美,我正在重构它,但你也许可以从中得到一些帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
相关资源
最近更新 更多