Dies ist eine ziemlich seltsame Sache, und es ist schwer zu reproduzieren. Nicht der beste Zustand eines Fehlerberichtes, entschuldige ich mich.Firebase-Transaktionen kehren viel später zurück?
Ich verwende .transaction(), um einen Wert an einen Speicherort in Firebase zu schreiben. Hier einige Pseudo-Code:
Shop ein Wert an einer Stelle über die Transaktion:
var ref = firebase.child('/path/to/location'); var storeSafely = function(val) { ref.transaction( function updateFunc(currentData) { console.log('Attempting update: ' + JSON.stringify(val)); if (currentData) return; return val; }, function onTransactionCompleteFunc(err, isCommitted, snap) { if (err) { console.log('Error in onTransactionCompleteFunc: ' + JSON.stringify(err)); return; } if (! isCommitted) { console.log('Not committed'); return; } ref.onDisconnect().remove(); doSomeStuff(); }); }; var doSomeStuff = function() { // Things get done, time passes. console.log('Cleaning up'); ref.onDisconnect().cancel(); ref.set( null, function onSetCompleteFunc(err) { if (err) { console.log('Error in onSetCompleteFunc: ' + JSON.stringify(err)); } }); }; storeSafely(1); // later... storeSafely(2); // even later... storeSafely(3);
ich effektiv Firebase Transaktionen als eine Art Mutex-Sperre verwenden.
Setzen Sie den OnDisconnect für den Standort, um den Wert zu entfernen, falls meine App während der Arbeit stirbt.
Tun Sie etwas.
Entfernen Sie die OnDisconnect für den Standort, weil ich mit dem Zeug fertig bin.
Entfernen Sie den Wert an der Stelle.
Ich mache das alle paar Minuten, und es funktioniert alles super. Dinge werden perfekt geschrieben und entfernt, und die Logs zeigen mir, wie ich das Schloss erstelle, Sachen mache und dann das Schloss loslasse.
Der seltsame Teil ist, was passiert Stunden später. Gelegentlich hat Firebase Wartung, und meine App erhält eine Reihe von Berechtigungen verweigert Fehler. Zur gleichen Zeit dies geschieht, beginne ich plötzlich ein paar diese Ausgabe in den Protokollen erhalten:
Attempting update 1
Attempting update 2
Attempting update 3
... in anderen Worten, es sieht aus wie die Transaktionen nicht vollständig abgeschlossen, und sie versuchen, erneut zu versuchen Jetzt kann der Ort nicht mehr gelesen werden. Es ist fast so, als würde der transaction() - Code, der nie abgeschlossen wurde, geschlossen, und er wird jetzt aus irgendeinem Grund erneut ausgeführt.
Fehle mir hier etwas wirklich Wichtiges darüber, wie man eine Transaktion beendet?
(Anmerkung:.. Ich gepostet ursprünglich auf die Firebase Google-Gruppe, wurde aber daran erinnert, schließlich, dass Code Fragen sollen, Stack-Überlauf gehen ich entschuldige mich für die Cross-Posting)