Sincronização do Firebase de dados modificados localmente: tratamento de erros e status global
Eu tenho duas perguntas relacionadas a respeito doPlataforma Web Firebaseésincronização de dados modificados localmente para o servidor:
Todo cliente que compartilha um banco de dados Firebase mantém sua própria versão interna de qualquer dado ativo. Quando os dados são atualizados ou salvos, eles são gravados nesta versão local do banco de dados. O cliente Firebase sincroniza esses dados com os servidores Firebase e com outros clientes com base no 'melhor esforço'.
1. Manipulando Erros de SincronizaçãoOs métodos de modificação de dados (set()
, remove()
, etc) pode demoraronComplete
parâmetro de retorno de chamada:
Uma função de retorno de chamada que será chamada quando a sincronização com os servidores Firebase for concluída. O retorno de chamada será passado umError
objeto em falha; outronull
.
var onComplete = function(error) {
if (error) {
console.log('Synchronization failed');
} else {
console.log('Synchronization succeeded');
}
};
fredRef.remove(onComplete);
No exemplo acima, que tipo de erros ofredRef.remove()
retorno de chamada espera receber?
Existe uma maneira de distinguir entre erros temporários e permanentes?
Como devemos lidar / recuperar esses erros?
Para erros temporários, precisamos chamarfredRef.remove()
novamente após um curto período de tempo, para tentar novamente a operação?
Eu percebo que cada chamada paraset()
eremove()
receberá um resultado de sucesso / falha de sincronização individual noonComplete
ligue de volta. Mas estou procurando uma maneira de determinar ostatus de sincronização global de todo o cliente Firebase.
Eu gostaria de usar umbeforeunload
ouvinte de evento para avisar o usuário quando tentar sair da página antes que todos os dados modificados tenham sido sincronizados com o servidor, e estou procurando alguma função comofirebase.isAllModifiedDataSynced()
. Algo assim:
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.';
}
});
Aqui está um exemplo da mesma funcionalidade no Google Drive:
Estou ciente doespecial/.info/connected
localização:
é útil que um cliente saiba quando está online ou offline. Os clientes Firebase fornecem um local especial em/.info/connected
que é atualizado sempre que o estado da conexão do cliente é alterado. Aqui está um exemplo:
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");
}
});
O especial/.info/connected
local pode ser conectado a umbeforeunload
ouvinte de eventos como este:
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.';
}
});
Minha pergunta é:
E seisConnected
étrue
, isso também significa que todos os dados modificados foram sincronizados com o servidor?ou seja,"conectado" também significa"sincronizado"?Caso contrário, como o aplicativo pode determinar o status de sincronização global de todo o cliente Firebase?
Existe um especial/.info/synchronized
localização?O aplicativo precisa acompanhar manualmente o resultado de êxito / falha da sincronização de todos osonComplete
ligue de volta?