gpt4 book ai didi

firebase - Firestore onSnapshot 更新事件是否由于本地客户端设置而导致?

转载 作者:行者123 更新时间:2023-12-02 19:24:02 25 4
gpt4 key购买 nike

简单版本:当我在Firestore中注册onSnapshot时,有没有办法知道我是否是推送更新的客户端?

详细版本:
打开网页时,它会将 onSnapshot 回调注册到名为 notes 的 Firestore 集合。然后下载该集合并将其存储在本地数组 var Notes = [] 中。

var window.notes = []
let notesRef = refs.db.collection('notes')
notesRef.onSnapshot(querySnapshot => {
querySnapshot.docChanges.forEach((docChange) => {
switch (docChange.type) {
case 'added':
notes.push(docChange.doc.data())
break
}
})
}

然后我们在本地更新注释并将其推送到数据库。

notes[0] =  'changed contents'
firestore.notesRef.doc(0).set(notes[0])

这会将注释发送到 firestore,在远程数据库中更新它,然后因为我们已注册到 notes 集合的 onSnapshot,所以我们将触发该注释事件并获取已修改更改。

let notesRef = refs.db.collection('notes')
notesRef.onSnapshot(querySnapshot => {
querySnapshot.docChanges.forEach((docChange) => {
switch (docChange.type) {
case 'added':
notes.push(docChange.doc.data())
break
case 'modified':
// ********** We end up here!!! ***********
// Probably want to do:
notes[docChange.doc.id] = docChange.doc.data()
break
}
})
}

有没有办法检测同一个客户端是否调用了触发modified docChange的set
要点是:如果用户自己进行了更改,那么他们不关心更改广告,我们应该忽略它。如果其他用户进行了更改,则应让该用户选择是否要更新其本地版本。

根据我的经验,当调用 firestore.notesRef.doc(0).set(notes[0]) 时,需要一些时间才能从服务器接收更新。如果本地用户此时再次修改注释但尚未将其推送到服务器,则他们的更改将丢失(被服务器版本覆盖 - 他们上次发送到服务器的版本)。这本质上是一种竞争条件。

那么,当我在Firestore中注册onSnapshot时,有没有办法知道我是否是推送更新的客户端?

最佳答案

您可以通过以下方式查看这是本地更改还是远程更改:

docChange.doc.metadata.hasPendingWrites

如果 hasPendingWrites 为 true,则更新的来源是本地的。本地缓存已更新,对服务器的写入仍待处理。如果 hasPendingWrites 为 false,则更新的来源是远程的。

查看如何将其与以下代码段中的 onSnapshot 一起使用:

let notesRef = refs.db.collection('notes')
notesRef.onSnapshot(querySnapshot => {
querySnapshot.docChanges.forEach((docChange) => {
switch (docChange.type) {
case 'added':
notes.push(docChange.doc.data())
break
case 'modified':
// ********** New Code ***********
let source = docChange.doc.metadata.hasPendingWrites ? 'Local' : 'Server'
if (source === 'Server') {
notes[docChange.doc.id] = docChange.doc.data()
} else {
// Do nothing, it's a local update so ignore it
}
// ********** New Code End ***********
break
}
})
}

关于firebase - Firestore onSnapshot 更新事件是否由于本地客户端设置而导致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50186413/

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