Javascript Firestore客户端是否缓存文档引用?

时间:2020-07-11 16:46:48

标签: google-cloud-firestore

以防万一,在这里我试图解决XY问题,这里是一些上下文(domain是一个角色扮演游戏伴侣应用程序)。我有一个文档(广告系列),其中包含一个集合(字符),并且正在使用angular.io / angularfire。

此处的核心问题是,如果我查询广告系列中的字符集合,则会得到keyct.press(keyprsd.get())。我可以在Observable<Character[]>中使用它,但这在下游有点混乱-我真的想做一些事情,例如将属性块作为独立组件(*ngFor let character of characters | async)等等。

这最终意味着在实际的显示组件中,我混合了一些通过ngOnChanges更改的项(来自角色的东西)和可观察的项(由全局服务注入的项,例如用户扮演特定角色) )。

我有两种选择可以使这种清洁器更清洁(零是:忽略它)。

一个:我可以将所有可能的依赖关系平化为标量,而不是可观察的(可能是通过将诸如属性之类的东西视为真正的仅视图组件并将更多数据作为直接输入来注入-{{ 1}}等。可显示的更改需要您自己照顾。

两个:我可以找到一种神奇的方式将<character-attributes [character]="character">转换为<character-attributes [character]="" [player]="" [gm]="">,这正是我想要的,然后将可观察到的Character传递到各种角色显示块(有几种不同的显示选项,具体取决于您是玩家(因此,您需要角色的更多详细信息,以及关于其他所有事物的小信息)还是GM(因此,您想要有关所有事物的中间细节)可以在任何地方扩展成细节。

:我可以将Observable<Character[]>传递给我的组件,而不是将整个Observable<Observable<Character>[]>传递给我的组件,而让子组件在Character中为其构造一个可观察的对象。 (或者也许是ngOnChanges中的character.id,尚不清楚角度运行时是否会通过更改参数来将实际组件重用于不同的项目,但这是一个不同的堆栈溢出问题)。在这种情况下,我将对同一文档进行多次读取-一次在查询中获取所有字符,一次在每个被赋予characterId且需要获取可观察到的字符的视图组件中。

问题是:如果我在代码中的三个不同位置进行了ngOnInit,后来又进行了switchMap,那是否会调用四个Firestore读取(用于计费) ,一次阅读还是两次阅读(一次用于查询,一次用于文档)?

我研究了firebase javascript sdk,它looks like可能会通过仅维护一组侦听器来处理同一项目的多个查询,但坦率地说,我对这里的代码考古学不敢相信

在某处也可能有四个选项。我可能对此进行了过度设计,但是这个特定的玩具项目主要是为了让我可以在Firestore中与最佳实践进行较量,因此我想弄清楚什么是正确的方法。

1 个答案:

答案 0 :(得分:1)

我查看了从SDK链接的代码,它可能很聪明,足以优化同一文档的多个观察者,使其仅读取一次文档。但是,这是依赖于实现的危险,因为它不是公共API的一部分,可能会在不另行通知的情况下进行更改。

一方面,如果您已意识到上述危险并且仍然愿意进行调查,则可以通过从控制台UI或通过检查读取使用情况来创建一些测试程序,以发现当前的工作方式临时修改SDK源代码,并添加一些日志记录,以帮助您了解幕后发生的事情。

另一方面,我认为部分问题是从应用程序状态管理的角度提出的。实际上,聆听集合或聆听每个单独的文档都会将相同的更改通知给应用程序,IMO此处的不同之处在于数据将如何在组件之间流动以及如何管理这些更改。在这方面,我会选择在代码方面感觉更好的方法。

希望这会有所帮助。