Firebase-Synchronisation lokal geänderter Daten: Fehlerbehandlung und globaler Status

Ich habe zwei verwandte Fragen zumFirebase Webplattform 'ssynchronisation lokal geänderter Daten auf den Server:

eder Client, der eine Firebase-Datenbank freigibt, verwaltet seine eigene interne Version aller aktiven Daten. Wenn Daten aktualisiert oder gespeichert werden, werden sie in diese lokale Version der Datenbank geschrieben. Der Firebase-Client synchronisiert diese Daten dann nach besten Kräften mit den Firebase-Servern und anderen Clients.

1. Behandlung von Synchronisationsfehlern

Die Datenänderungsmethoden set(), remove(), etc) kann ein @ nehmonComplete Rückrufparameter:

Eine Rückruffunktion, die aufgerufen wird, wenn die Synchronisation mit den Firebase-Servern abgeschlossen ist. Der Rückruf wird mit einem @ beantwortError Objekt bei Fehler; sonstnull.

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

fredRef.remove(onComplete);

In obigem Beispiel, welche Art von Fehlern sollte dasfredRef.remove() Rückruf erwartet?

Temporäre Fehler?Client ist offline (Netzwerkverbindung unterbrochen)?Firebase-Server ist vorübergehend überlastet oder wegen Wartungsarbeiten inaktiv, wird aber bald wieder verfügbar sein? Permanente Fehler?Permission verweigert (wegenSicherheitsregeln)?Datenbankspeicherort existiert nicht?

Gibt es eine Möglichkeit, zwischen vorübergehenden und dauerhaften Fehlern zu unterscheiden?

Wie sollen wir mit diesen Fehlern umgehen / sie beheben?

Bei vorübergehenden Fehlern müssen wir @ anruffredRef.remove() Nach kurzer Zeit erneut versuchen, den Vorgang zu wiederholen?

2. Globaler Synchronisierungsstatus

Ich merke, dass jeder Anruf anset() undremove() erhält ein individuelles Ergebnis für die erfolgreiche / fehlgeschlagene Synchronisierung imonComplete Ruf zurück. Aber ich suche nach einer Möglichkeit, das @ zu bestimmglobaler Synchronisationsstatus des gesamten Firebase-Clients.

Ich möchte ein @ verwendbeforeunload Event-Listener, um den Benutzer zu warnen, wenn er versucht, die Seite zu verlassen, bevor alle geänderten Daten mit dem Server synchronisiert wurden, und ich suche nach einer Funktion wiefirebase.isAllModifiedDataSynced(). Etwas wie das

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.';
    }
});

Hier ist ein Beispiel für die gleiche Funktionalität in Google Drive:

Ich kenne dasBesondere/.info/connected Lag:

it ist nützlich, damit ein Client weiß, wann er online oder offline ist. Firebase-Clients bieten einen speziellen Standort unter/.info/connected, das jedes Mal aktualisiert wird, wenn sich der Verbindungsstatus des Clients ändert. Hier ist ein Beispiel

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");
  }
});

Das Sonderangebot/.info/connected location kann mit einem @ verbunden werdbeforeunload Event-Listener wie folgt:

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.';
    }
});

Meine Frage ist

WennisConnected isttrue, Bedeutet dies auch, dass alle geänderten Daten mit dem Server synchronisiert wurden? d.h. Hat"in Verbindung gebracht" also mean "synchronisiert"?

Wenn nicht, wie kann die App den globalen Synchronisierungsstatus des gesamten Firebase-Clients ermitteln?

Gibt es ein spezielles/.info/synchronized Lage Muss die App den Erfolg / Misserfolg der Synchronisierung für jedes @ manuell protokolliereonComplete Ruf zurück

Antworten auf die Frage(2)

Ihre Antwort auf die Frage