这是我的代码:
import { doc, docData } from '@angular/fire/firestore';
const gameDocRef = doc(this.firestore, 'game', game.id);
const game$ = docData(gameDocRef, { idField: 'id' })
不知何故,
game$
可观察对象连续发出两次相同的发射
一些注意事项:
当然,我可以对可观察对象执行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 持久性。
该值在发送到数据库(第二次触发 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);
})
);
...