Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 如何从firestore ref(web客户端)接收修补程序更新_Firebase_Google Cloud Firestore - Fatal编程技术网

Firebase 如何从firestore ref(web客户端)接收修补程序更新

Firebase 如何从firestore ref(web客户端)接收修补程序更新,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我们正在使用CloudFireStore创建一个多用户绘图应用程序。我们使用mobx状态树(MST)管理状态。我们希望在所有用户的MST文档应用程序状态之间实现健壮的多用户同步 我们尝试了几种方法: 文档级更新 当用户1更新其图形时,我们会在每次更改时更新整个服务器文档。用户2侦听这些更改并应用这些更改的快照来修改状态树。只要数据保持同步,这就可以正常工作。但是,如果用户2在服务器更新时进行更改,则该更改将被用户1的更改覆盖 以下是“侦听器”的代码 reaction( () =>

我们正在使用CloudFireStore创建一个多用户绘图应用程序。我们使用mobx状态树(MST)管理状态。我们希望在所有用户的MST文档应用程序状态之间实现健壮的多用户同步

我们尝试了几种方法:

文档级更新

当用户1更新其图形时,我们会在每次更改时更新整个服务器文档。用户2侦听这些更改并应用这些更改的快照来修改状态树。只要数据保持同步,这就可以正常工作。但是,如果用户2在服务器更新时进行更改,则该更改将被用户1的更改覆盖

以下是“侦听器”的代码

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();
            });
    }
);