Firebase同步本地修改的数据:处理错误和全局状态

Tac*_*tex 5 javascript data-synchronization firebase firebase-realtime-database

我有一个关于这两个相关的问题火力地堡网络平台本地修改数据发送到服务器的同步:

共享Firebase数据库的每个客户端都维护其自己的内部版本的任何活动数据.更新或保存数据时,会将其写入此数据库的本地版本.然后,Firebase客户端会以"尽力而为"的方式将该数据与Firebase服务器以及其他客户端同步.


1.处理同步错误

数据修改方法(set(), remove()等)可以采用onComplete回调参数:

在与Firebase服务器同步完成后将调用的回调函数.回调将Error在失败时传递一个对象; 别的null.

var onComplete = function(error) {
  if (error) {
    console.log('Synchronization failed');
  } else {
    console.log('Synchronization succeeded');
  }
};

fredRef.remove(onComplete);
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,fredRef.remove()回调期望接收哪种错误?

  • 暂时的错误?
    • 客户端离线(网络连接丢失)?
    • Firebase服务器暂时过载或关闭以进行维护,但很快就会再次提供?
  • 永久性错误?
    • 权限被拒绝(由于安全规则)?
    • 数据库位置不存在?

有没有办法区分临时和永久错误?

我们应该如何处理/从这些错误中恢复?

对于临时错误,我们是否需要fredRef.remove()在短时间后再次呼叫,以重试操作?


2.全局同步状态

我意识到每次调用set()并将remove()onComplete回调中收到单独的同步成功/失败结果.但我正在寻找一种方法来确定整个Firebase客户端全局同步状态.

我想使用一个beforeunload事件监听器来警告用户在所有修改过的数据同步到服务器之前他们试图离开页面,我正在寻找一些类似的功能firebase.isAllModifiedDataSynced().像这样的东西:

window.addEventListener('beforeunload', function (event) {
    if (!firebase.isAllModifiedDataSynced()) {
        event.returnValue = 'Some changes have not yet been saved. If you ' +
                            'leave this page, your changes will be lost.';
    }
});
Run Code Online (Sandbox Code Playgroud)

以下是Google云端硬盘中相同功能的示例:

Google Drive截图

我知道特殊的/.info/connected位置:

对于客户来说,了解它何时在线或离线是很有用的.Firebase客户端提供了一个特殊位置,/.info/connected每当客户端的连接状态发生变化时,该位置都会更新.这是一个例子:

var connectedRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/.info/connected");
connectedRef.on("value", function(snap) {
  if (snap.val() === true) {
    alert("connected");
  } else {
    alert("not connected");
  }
});
Run Code Online (Sandbox Code Playgroud)

特殊/.info/connected位置可以连接到这样的beforeunload事件监听器:

var connectedRef = new Firebase('https://myapp.firebaseio.com/.info/connected');
var isConnected  = true;

connectedRef.on('value', function (snap) {
    isConnected = snap.val();
});

window.addEventListener('beforeunload', function (event) {
    if (!isConnected) {
        event.returnValue = 'Some changes have not yet been saved. If you ' +
                            'leave this page, your changes will be lost.';
    }
});
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 如果isConnectedtrue,这是否也意味着所有已修改的数据已同步到服务器?
  • "连接"是否也意味着"同步"

如果没有,该应用如何确定整个Firebase客户端的全局同步状态?

  • 有特殊的/.info/synchronized位置吗?
  • 应用程序是否需要手动跟踪每个onComplete回调的同步成功/失败结果?

Fra*_*len 6

在上面的例子中,fredRef.remove()回调应该接收什么样的错误?

客户端离线(网络连接丢失)?

不,这不会导致错误传递给完成侦听器.它只会导致完成侦听器不被调用(尚未).

Firebase服务器暂时过载或关闭以进行维护,但很快就会再次提供?

不.这与没有网络连接基本相同.

权限被拒绝(由于安全规则)?

是的,这确实会导致错误传递给完成处理程序.

数据库位置不存在?

不,这不会导致对完成侦听器造成错误.

如果isConnected为true,这是否也意味着所有已修改的数据已同步到服务器?即"连接"是否也意味着"同步"?

不,不是的..info/connected在与数据库建立连接时将触发true.

如果没有,该应用如何确定整个Firebase客户端的全局同步状态?

目前无法确定您的本地数据是否与服务器保持同步.

是否有特殊的/.info/synchronized位置?

不,这样的位置不存在.

应用程序是否需要手动跟踪每个onComplete回调的同步成功/失败结果?

这取决于用例.但是,如果您只想知道所有写入的执行时间,请按下虚拟值并等待其完成.由于Firebase按顺序执行写入,因此您可以在该阶段确定您已获得其他事件.