关于Firebase web platform,我有两个相关的问题 synchronisation of locally-modified data to the server:
每个共享Firebase数据库的客户端都会维护自己的内部版本的所有活动数据。 更新或保存数据时,会将其写入此数据库的本地版本。 然后,Firebase客户端会以“尽力而为”的方式将这些数据与Firebase服务器以及其他客户端同步。
数据修改方法
(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()
回调期望接收哪种错误?
有没有办法区分临时和永久错误?
我们应该如何处理/从这些错误中恢复?
对于临时错误,我们是否需要在短时间后再次呼叫fredRef.remove()
以重试操作?
我意识到每次拨打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云端硬盘中相同功能的示例:
我知道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.';
}
});
我的问题是:
isConnected
为true
,是否也意味着所有已修改的数据已同步到服务器? 如果没有,该应用如何确定整个Firebase客户端的全局同步状态?
/.info/synchronized
位置?onComplete
回调的同步成功/失败结果?答案 0 :(得分:6)
在上面的示例中,fredRef.remove()回调应该接收哪种错误?
客户端离线(网络连接丢失)?
不,这不会导致错误传递给完成侦听器。它只会导致完成侦听器(尚未)被调用。
Firebase服务器暂时过载或关闭以进行维护,但很快就会再次使用?
没有。这与没有网络连接基本相同。
权限被拒绝(由于安全规则)?
是的,这确实会导致错误传递给完成处理程序。
数据库位置不存在?
不,这不会导致对完成侦听器造成错误。
如果isConnected为true,这是否也意味着所有已修改的数据已同步到服务器?即&#34;连接&#34;也意味着&#34;同步&#34;?
不,不。当与数据库建立连接时,.info/connected
将为true。
如果没有,该应用如何确定整个Firebase客户端的全局同步状态?
目前无法确定您的本地数据是否与服务器保持同步。
是否有特殊的/.info/synchronized位置?
不,这样的位置不存在。
应用是否需要手动跟踪每个onComplete回调的同步成功/失败结果?
这取决于用例。但是,如果您只想知道所有写入的执行时间,请按下虚拟值并等待其完成。由于Firebase按顺序执行写入操作,因此您可以在该阶段确定您已获得其他事件。