Простая версия:
Когда я регистрируюсь на onSnapshot в Firestore, есть ли способ узнать, являюсь ли я клиентом, который выдвинул обновление?
Подробная версия:
Когда веб-страница открыта, она регистрирует обратный вызов onSnapshot в коллекцию Firestore с именем notes
. Затем коллекция загружается и сохраняется в локальном массиве 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, обновит ее в удаленной базе данных, затем, поскольку мы зарегистрированы на onSnapshot
для коллекции notes
, мы запустим это событие и получим изменение modified
.
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
}
})
}
Есть ли способ обнаружить, если этот самый клиент назвал set
, который вызвал modified
docChange?
Суть в том, что: если пользователь внес изменение самостоятельно, то ему не нужно заботиться об изменении объявления, мы должны его игнорировать. Если другой пользователь внес изменения, ему следует предоставить выбор, хотят ли они обновить свою локальную версию.
По моему опыту, когда вызывается firestore.notesRef.doc(0).set(notes[0])
, требуется некоторое время, чтобы получить обновление с сервера. Если локальный пользователь изменяет заметку снова в это время, но еще не отправил ее на сервер, тогда его изменения теряются (переопределяются версией сервера - версией, которую они в последний раз отправили на сервер). По сути, это состояние гонки.
Итак, когда я регистрируюсь на onSnapshot в Firestore, есть ли способ узнать, являюсь ли я клиентом, который выдвинул обновление?