Firebase docData 流连续多次发出相同的对象值

问题描述 投票:0回答:1

这是我的代码:

import { doc, docData } from '@angular/fire/firestore';

const gameDocRef = doc(this.firestore, 'game', game.id);
const game$ = docData(gameDocRef, { idField: 'id' })

不知何故,

game$
可观察对象连续发出两次相同的发射

一些注意事项:

  • 我正在记录和检查:流仅创建一次
  • 我正在记录和检查:相同的深度复制对象被发出两次
  • 我只向我的 firestore 后端发出一个请求,但此请求会导致两次相同的排放

当然,我可以对可观察对象执行distinctUntilXChanged,但据我所知,这仍然会将它们计为我的Firestore配额中的两个不同读取。这是我试图避免的主要问题,我不想为 firestore 支付比实际需要多两倍的钱。

这就是我确定排放是否相同的方法:

        const currentGameJSON = JSON.stringify(currentGame);
        const newGameJSON = JSON.stringify(game);
        if (currentGameJSON === newGameJSON) {
          console.error("SAME GAME EMISSION", currentGameJSON);
        }

我的文档没有递归 props 或任何像这样的奇怪的东西,简单的 JSON。

我没有启用 Firestore 持久性。

angular firebase google-cloud-firestore rxjs angularfire2
1个回答
0
投票

该值在发送到数据库(第二次触发 observable)之前在本地更新一次(触发 observable 一次),这给人的印象是有两次发送和多次保存到数据库。但我找到了 Tim Thompson 的一个参考答案,它通过将

distinctUntilChanged
添加到可观察流中解决了这个问题,这样就存在单一排放。

如果您将

offline
设置为网络选项卡并触发更新,您将看到可观察对象被触发,甚至没有任何保存到数据库。

private getGameDocData(gameId: string, currentUserId: string): Observable<Game | null> {
    const gameDocRef = doc(this.firestore, 'games', gameId);

    const game$ = docData(gameDocRef, { idField: 'id' }).pipe(
      distinctUntilChanged(), // <- Changed here!
      map(data => (data ? (data as Game) : null)),
      tap((data) => {
        console.log("🔵 intrinsic stream emission:", data);
      })
    );
    ...
© www.soinside.com 2019 - 2024. All rights reserved.