在我的应用中,我有一个名为列表的现有集合。我也有这样的实时监听器(功能1):
firebase.firestore().collection('lists').doc(listId)
.onSnapshot(listSnapshot => {
if (listSnapshot.exists) {
// Do something
}
});
在其他地方,我具有用于更新集合中每个列表的功能(功能2):
firebase.firestore().collection('lists').get()
.then(querySnapshot => {
querySnapshot.forEach(docSnapshot => {
firebase.firestore().collection('lists').doc(docSnapshot.id).update({ modDate: Date.now() });
});
});
在大多数情况下,应用程序启动时会调用功能1。在这种情况下,侦听器将返回与listId对应的文档。然后,在稍后的某个时间,当通过功能2更新该文档时,该功能将导致再次触发功能1侦听器,并返回与listId相对应的文档的更新值。那是所有预期的行为。
但是,有时偶尔会在启动过程中实际上在功能1之前或与功能1并发调用功能2。在那种情况下,通过功能2更新现有文档会导致功能1触发,但是对于与listId对应的文档,返回未定义的值(例如listSnapshot.exists为false)。现在,如果严格来说是竞争条件,我可以看到函数1返回与listId对应的文档的旧值。但是我根本没有任何值,这是在文档被删除(未更新)时通常发生的情况。
我可以修改逻辑,以确保功能2仅在前者之后运行,但我想了解问题的根源。