gpt4 book ai didi

javascript - 意外的 Firebase Firestore 集合订阅行为

转载 作者:行者123 更新时间:2023-11-29 20:55:12 25 4
gpt4 key购买 nike

我在订阅集合的 valueChanges 时遇到了一些有趣的行为。

创建文档后,立即调用集合的订阅,但我收到的不是许多文档的数组,而是一个大小为 one 的数组 - 单个新创建的文档。

通读此文后(Firestore Docs | Get Realtime Updates)我仍然有点困惑。

Local writes in your app will invoke snapshot listeners immediately. This is because of an important feature called "latency compensation." When you perform a write, your listeners will be notified with the new data before the data is sent to the backend.

这是否解释了我所看到的行为?


这是一个stackblitz证明问题。只需取消注释掉 ngOnInit() 中的注释行并重新加载以查看我认为是预期的行为。


我可以通过在其他地方使用空订阅收听此集合或直接复制之前的 take(1) 订阅代码来解决此问题

最佳答案

这是一个很好的收获。很确定你是对的 - valueChanges() 如文档所述:

The current state of your collection. Returns an Observable of data as a synchronized array of JSON objects.

当你发现自己时:

Local writes in your app will invoke snapshot listeners immediately.

这就是发生的事情:

您的addPizza() 是一个异步 函数。它向 backed 发送添加新比萨饼的请求。但它不会等待任何事情并跳转到您的第二个函数 - this.getPizzasAsyncAwait()。因为本地写入会立即调用监听器,所以您的 Observable 会发出该值并广播它。并且由于您还使用了 Rxjs 的 take(1) - 之后它取消订阅。这也解释了为什么 take(2) 带来所有其他记录。您可以将 getPizzasNormal() 方法移至 OnInit(),您将收到整个集合。

关于javascript - 意外的 Firebase Firestore 集合订阅行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49630053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com