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

7

关于Firebase web平台将本地修改的数据同步到服务器,我有两个相关问题:

每个使用Firebase数据库的客户端都维护着自己的活动数据的内部版本。当数据被更新或保存时,它会被写入该数据库的本地版本。然后Firebase客户端会尽最大努力将该数据与Firebase服务器和其他客户端进行同步。


1. 处理同步错误

数据修改方法(set()remove()等)可以接受一个onComplete回调参数:

A callback function that will be called when synchronization to the Firebase servers has completed. The callback will be passed an Error object on failure; else null.

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

fredRef.remove(onComplete);
在上面的示例中,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.';
    }
});

这是 Google Drive 中相同功能的示例:

Google Drive screenshot

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

it is useful for a client to know when it is online or offline. Firebase clients provide a special location at /.info/connected which is updated every time the client's connection state changes. Here is an example:

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这是否意味着所有修改的数据都已同步到服务器?
  • 即,"connected"是否也意味着"synced"

如果不是,应用程序如何确定整个Firebase客户端的全局同步状态?

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

8
在上面的例子中,fredRef.remove()回调应该期望收到哪些类型的错误?
客户端离线(网络连接丢失)吗?不会导致错误传递给完成监听器。它只会导致完成监听器尚未被调用。
Firebase服务器暂时过载或正在维护,但很快就会再次可用吗?不是。这与没有网络连接基本相同。
权限被拒绝(由于安全规则)吗?是的,这确实会导致错误传递给完成处理程序。
数据库位置不存在?不会导致错误传递给完成监听器。
如果 isConnected 为 true,这是否意味着所有修改的数据都已同步到服务器?即“connected”是否也意味着“synced”?不会。当连接到数据库时,.info/connected 将触发 true。
如果不是,如何确定整个 Firebase 客户端的全局同步状态?目前没有办法确定本地数据是否与服务器同步。
是否有特殊的 /.info/synchronized 位置?不,不存在这样的位置。
应用程序需要手动跟踪每个 onComplete 回调的同步成功/失败结果吗?这取决于用例。但是,如果您只想知道何时执行所有写入操作,请推送虚拟值并等待其完成。由于 Firebase 按顺序执行写入操作,因此在那个阶段,您可以确定已收到其他事件。

1
@Frank van Puffelen 的状态还是一样的吗? - MasterScrat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接