我有两个相关问题Firebase 网络平台 https://www.firebase.com/docs/web/'s
将本地修改的数据同步到服务器 https://www.firebase.com/docs/web/guide/offline-capabilities.html#section-local:
共享 Firebase 数据库的每个客户端都会维护自己的任何活动数据的内部版本。
更新或保存数据时,会将其写入数据库的本地版本。
然后,Firebase 客户端会“尽最大努力”将该数据与 Firebase 服务器和其他客户端同步。
1. 处理同步错误
数据修改方法
(set() https://www.firebase.com/docs/web/api/firebase/set.html,
remove() https://www.firebase.com/docs/web/api/firebase/remove.html, ETC)
可以采取onComplete
回调参数:
同步到 Firebase 服务器时将调用的回调函数
已完成。回调将传递一个Error
反对失败;别的null
.
var onComplete = function(error) {
if (error) {
console.log('Synchronization failed');
} else {
console.log('Synchronization succeeded');
}
};
fredRef.remove(onComplete);
在上面的例子中,应该出现什么样的错误fredRef.remove()
期望收到回调?
-
Temporary errors?
- 客户端离线(网络连接丢失)?
- Firebase 服务器暂时超载或停机进行维护,但很快就会再次可用?
-
Permanent errors?
- 权限被拒绝(由于安全规则 https://www.firebase.com/docs/security/guide/securing-data.html) ?
- 数据库位置不存在?
有没有办法区分暂时性错误和永久性错误?
我们应该如何处理/从这些错误中恢复?
对于临时错误,我们是否需要调用fredRef.remove()
过一段时间后再次重试该操作?
2. 全局同步状态
我意识到每次打电话set()
and remove()
将收到单独的同步成功/失败信息
结果是onComplete
打回来。但我正在寻找一种方法来确定整个 Firebase 客户端的全局同步状态.
我想用一个beforeunload https://developer.mozilla.org/en-US/docs/Web/Events/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 云端硬盘中相同功能的示例:
我知道special /.info/connected地点 https://www.firebase.com/docs/web/guide/offline-capabilities.html#section-connection-state:
对于客户端来说,了解其何时在线或离线非常有用。
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.';
}
});
我的问题是:
- If
isConnected
is true
, 这是否也意味着所有修改的数据都已同步到服务器?
- 即是否“连接的”也意味着"synced"?
如果不是,应用程序如何确定整个 Firebase 客户端的全局同步状态?
- 有没有特别的
/.info/synchronized
地点?
- 应用程序是否需要手动跟踪每个同步的成功/失败结果
onComplete
打回来?