Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 将Rxjs与Firebase配合使用(角度5)_Angular_Firebase_Rxjs - Fatal编程技术网

Angular 将Rxjs与Firebase配合使用(角度5)

Angular 将Rxjs与Firebase配合使用(角度5),angular,firebase,rxjs,Angular,Firebase,Rxjs,由于我在angular/firebase上工作,我对Rxjs与angular 2+上的firebase的良好使用有点困惑,尤其是与带有firebase.on/once的Observable/Subject。我没有找到这方面的好例子 首先,我认为我对每一个的理解都是可以的(当我把它们结合在一起时,我感到困惑),我不确定我的解释: 主题:一个数据生产者和一个数据消费者,订阅此主题的可观察对象将类似于“依赖” 可观察的:数据将更加“独立”的数据生产者 firebase.database().ref(

由于我在angular/firebase上工作,我对Rxjs与angular 2+上的firebase的良好使用有点困惑,尤其是与带有firebase.on/once的Observable/Subject。我没有找到这方面的好例子

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

  • 主题:一个数据生产者和一个数据消费者,订阅此主题的可观察对象将类似于“依赖”
  • 可观察的:数据将更加“独立”的数据生产者
  • firebase.database().ref(…).on…:每次数据更改时调用查询
  • firebase.database().ref(…).once…:查询调用一次
我看到的一些问题/例子(让我困惑):

  • 将“firebase.database().ref(..).once…”(或.on)与Observable一起使用:如果查询已经提供了我们需要的内容,那么在这里使用Observable有什么意义
  • 什么时候使用Subject优于Observable+setters来更新“我自己”的数据
  • 假设您有/books,并且每本书都有一些属性(id、author、pages、title…(在您的代码中,它将存储在book[]),并且您希望更新例如author,是只更新此属性还是使用firebase(firebase.database().ref('/books').set(this.books);)更新所有书籍更好?我不知道为什么,但我觉得更新属性比更新所有对象更安全,但我经常看到所有对象的更新,最好的方法是什么
  • (编辑)在…上使用firebase.database()有什么意义。。。关于主题?once将给出相同的结果,并且将更加优化(更少的查询)否

    • 我将逐一回答您的问题:

      如果查询已经提供了我们所需要的东西,那么使用可观察对象有什么意义呢? 我认为需要注意的最重要的一点是,可观察对象是冷的,这意味着您可以创建复杂的数据流,它们在有人订阅此流之前不会被执行,这与查询不同,查询是在您创建时正确执行的

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

      什么时候使用Subject优于Observable+setters来更新“我自己”的数据? 这个问题的答案很简单:永远。因为firebase是实时的,所以您应该按照这一点做所有事情,使所有事情都异步。另外,
      Subject
      扩展了
      Observable
      Subject
      基本上是一个
      Observable
      ,它公开了它的
      emit
      方法,允许你在它上面生成自定义数据

      更新对象内部属性的最佳方法是什么? 对于这一点,我完全鼓励您使用firestore而不是firebase,原因很简单:定价(也因为数据模型tbh)。Firestore是一个文档数据库,您的用例完全用于文档数据库。它比firebase便宜得多,因为它根据查询量进行扩展,而不像firebase那样传输数据


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

      你应该考虑使用它,因为它使所有的事情都能为你工作,所以你不必担心这个问题。基本上,
      get
      调用将返回一个observable,每当您调用的
      get
      上的引用被更新时,它将发出一个新的值。@Supamiu我已经尝试过angularfire,但在键入对象时遇到了一些问题……这并不能解决我的困惑(我认为在使用“工具”之前理解概念是一件好事)但你是对的,我应该坚持,用天使之火训练自己!谢谢你的回答。我原以为Firestore只适用于android,但经过一些搜索()之后,它看起来很有趣(在我的情况下,我的web应用程序有很多聊天记录=很多更新,所以我不确定Firestore是否会更好),而且我肯定会在未来使用Firestore!在阅读了你的答案后,我想我会用主题升级我的整个项目!我忘了问:在。。。关于主题?once将给出相同的结果否?关键是使用
      .on
      将立即创建请求,而不是在订阅时创建请求,并且最终您将希望将其连接到Observable内部。但同样,angularfire2为您处理所有事情,我正在使用firebase和firestore创建一个angularfire2应用程序,由于angularfire2:)谢谢。Angularfire2看起来确实更易于使用(+在大多数情况下,您不需要使用服务直接在组件中获取数据?),但正如我所说,我已经尝试过了,并且在键入对象时遇到了很多问题,我需要将它们保存为“any”类型,否则我会出错(我认为将所有对象保存为any类型不是一件好事)@也许这可以帮助你:它一点也不完美,我正在重构它,但你可能会从中得到一些帮助