关于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; elsenull
.
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 中相同功能的示例:
/.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.';
}
});
我的问题是:
- 如果
isConnected
为true
,这是否意味着所有修改的数据都已同步到服务器? - 即,"connected"是否也意味着"synced"?
如果不是,应用程序如何确定整个Firebase客户端的全局同步状态?
- 是否有一个特殊的
/.info/synchronized
位置? - 应用程序是否需要手动跟踪每个
onComplete
回调的同步成功/失败结果?