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

时间:2016-02-08 22:22:33

标签: javascript firebase data-synchronization firebase-realtime-database

关于Firebase web platform,我有两个相关的问题 synchronisation of locally-modified data to the server

  

每个共享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);

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

  • 暂时错误?
    • 客户端离线(网络连接丢失)?
    • Firebase服务器暂时过载或停机以进行维护,但很快就会再次使用?
  • 永久性错误?
    • 权限被拒绝(由于security rules)?
    • 数据库位置不存在?

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

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

对于临时错误,我们是否需要在短时间后再次呼叫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.';
    }
});

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

Google Drive screenshot

我知道special /.info/connected location

  

对于客户来说,了解它何时在线或离线是很有用的。   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");
  }
});

特殊的/.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.';
    }
});

我的问题是:

  • 如果isConnectedtrue是否也意味着所有已修改的数据已同步到服务器?
  • 即。 “已连接”是否也意味着“已同步”

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

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

1 个答案:

答案 0 :(得分:6)

  

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

     

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

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

  

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

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

  

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

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

  

数据库位置不存在?

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

  

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

不,不。当与数据库建立连接时,.info/connected将为true。

  

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

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

  

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

不,这样的位置不存在。

  

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

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