2017-01-09 2 views
0

Ich habe versucht, Snapshot-Eigenschaften in Arrays zu speichern, aber aus irgendeinem Grund, wenn ich die Daten in der Abfrage beispielsweise mit on oder child_added speichern und die Daten mit einem foreach ausführen, werden die Daten innerhalb der Schleife und der Abfrage angezeigt , aber aus diesem ist sein Wert undefiniert, ich habe mit Objekten versucht, aber nur den letzten Wert gerettet. Wie konnte dieses Problem gelöst werden?So speichern Sie einen Snapshot in einem Array mit Firebase und JavaScript?

Hier ist ein Codefragment:

var array=[]; 
var ref= firebase.database().ref().child('messages'); 
ref.orderByChild("fecha").on('value',function(snapshot){ 
    snapshot.forEach(function(snap){ 
     //test array 
     array[0] = snap.val().text; 
     console.log(array[0]);//show the data 
    }); 
}); 

//but out of the loop 
console.log(array[0]);//Return undefined 
+0

"on" ist asynchron und sein Callback wird erst nach dem letzten Aufruf von "console.log" in Ihrem Snippet ausgelöst. – cartant

+0

Mögliches Duplikat von [Behandlung asynchroner Aufrufe (Firebase) in Funktionen] (http://stackoverflow.com/questions/11636731/handling-asynchronous-calls-firebase-in-functions) – cartant

Antwort

3

Die console.log am Boden läuft, bevor die in der Schleife. Dies wird asynchroner Code genannt.

Sie können nicht auf die Werte zugreifen, bevor sie von der API zurückgegeben wurden. Die Funktion .on wartet darauf, dass die Daten bereit sind und dann ausgeführt werden, weshalb die Daten dann verfügbar sind.

Es gibt keine Möglichkeit, die Daten außerhalb des Rückrufs zu "speichern" - der einzige Ort, an dem Sie wissen, was es ist, wird innerhalb des Rückrufs sein. Sie können es natürlich innerhalb des Callbacks an eine andere Funktion übergeben, aber es gibt keine Möglichkeit, es an die Position Ihrer zweiten console.log zu extrahieren.

Verwandte Themen