我有一些 RxFire 代码可以侦听 Firestore 集合查询(表示channels),并且对于每个结果,侦听 Realtime Database ref 以获取文档(表示该通道中的消息)。
我遇到的问题是每次 Firestore 查询更改时都会重新下载实时数据库文档,即使它们用于未更改的路径/引用。
这是一些伪代码:
collection(channelsQuery).pipe(
// Emits full array of channels whenever the query changes
switchMap(channels => {
return combineLatest(
channels.map(channel =>
// Emits the full set of messages for a given channel
list(getMessagesRef(channel)),
),
);
})
)
想象以下场景:
- 查询最初发出3 个Firestore 通道文档
- Observables 是为这 3 个通道的相应实时数据库 refs 创建的,它们发出它们的消息文档
- 添加了一个与原始查询匹配的新 Firestore 文档,该查询现在发出4 个通道文档
- Realtime Database 之前的 observable 被销毁,并为现在的4个通道创建新的,重新下载并发出之前3已经拥有的所有数据。
显然这并不理想,因为它会导致实时数据库上的大量冗余读取。在这种情况下,最佳做法是什么?请记住,当一个通道被删除时,我想销毁相应的 observable,它switchMap
已经这样做了。