Firebase 如何从firestore ref(web客户端)接收修补程序更新
我们正在使用CloudFireStore创建一个多用户绘图应用程序。我们使用mobx状态树(MST)管理状态。我们希望在所有用户的MST文档应用程序状态之间实现健壮的多用户同步 我们尝试了几种方法: 文档级更新 当用户1更新其图形时,我们会在每次更改时更新整个服务器文档。用户2侦听这些更改并应用这些更改的快照来修改状态树。只要数据保持同步,这就可以正常工作。但是,如果用户2在服务器更新时进行更改,则该更改将被用户1的更改覆盖 以下是“侦听器”的代码Firebase 如何从firestore ref(web客户端)接收修补程序更新,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我们正在使用CloudFireStore创建一个多用户绘图应用程序。我们使用mobx状态树(MST)管理状态。我们希望在所有用户的MST文档应用程序状态之间实现健壮的多用户同步 我们尝试了几种方法: 文档级更新 当用户1更新其图形时,我们会在每次更改时更新整个服务器文档。用户2侦听这些更改并应用这些更改的快照来修改状态树。只要数据保持同步,这就可以正常工作。但是,如果用户2在服务器更新时进行更改,则该更改将被用户1的更改覆盖 以下是“侦听器”的代码 reaction( () =>
reaction(
() => store.fileHash,
() => {
const dbRef = firebase.firestore();
dbRef.collection('files').doc(store.fileHash)
.onSnapshot(docSnapshot => {
applySnapshot(store, docSnapshot.data());
});
}
);
补丁更新
当用户1更新其图形时,我们使用MST onSnapshot检测更改,然后使用“事务”使用用户1所做的特定更改更新服务器上的数据。用户2通过侦听文档的更改从用户1接收更新。对于用户2,我们根据用户1的更改对MST执行补丁更新。理想情况下,我们希望这是一个典型的“补丁”更新,包括树中的路径和更改的数据。但是,我们无法弄清楚如何获取这些信息:确定firestore中发生了什么变化(从web客户端)
我们已经尝试跟踪用户2上一次推送的本地状态,并将其与来自用户1的传入更改进行“区分”。这使我们非常接近于能够确定“路径”,但它增加了边缘情况,我们想知道firestore中是否有其他方法来确定每次交易后发生的变化
reaction(
() => store.fileHash,
() => {
const dbRef = firebase.firestore();
dbRef.collection('files').doc(store.fileHash)
.onSnapshot(docSnapshot => {
this.counter--;
if (!this.lastSnapshot) {
applySnapshot(store, docSnapshot.data());
} else {
this.applyPatches(store, diff(this.lastSnapshot, docSnapshot.data()));
}
this.lastSnapshot = docSnapshot.data();
});
}
);