在我的angular项目中,我订阅了一个Firestore文档,如下所示:
const obs = this.db.collection('someCollection').doc('someDoc').valueChanges().subscribe(x=>console.log(x));
我只订阅了一个地方,我的模板中没有async管道。
当我直接写到Firebase这工作正确,我只收到一个日志。当我从AngularFirebase使用set方法时,我只收到一个日志。
this.db.collection('someCollection).doc('someDoc').set({value: 1});
//obs will log 'value:1'
但是当我使用更新方法时,我得到两个日志。
this.db.collection('someCollection').doc('someDoc').update({value: 1});
//obs will log 'value:1' two times.
在我看来,这应该只记录一次。什么好主意吗?
我的问题的答案是,该值是乐观地更新本地(导致可观察对象着火),然后该值被推到Firestore,并被重新读取导致可观察对象再次着火。
我想出的方法是关闭网络,并且可观察对象只触发一次。
这也解释了为什么当我直接写入Firestore时,可观察对象只触发一次。
所以,如果你想让可观察对象只触发一次,你必须在可观察对象上放一个distinctUntilChanged()函数。