3

Ich habe ein Problem beim Zugriff auf Daten in einem JS-Objekt festgestellt. Der Code, der die Daten (aus einer Firebase-Datenbank) sammelt sich wie folgt:Probleme beim Iterieren von JavaScript-Objekten

var get_user_data = function() { 
    ... 
    snapshot.forEach(function(child){ 
     var key = child.key; 
     var value = child.val(); 
     user_char[key] = value; 
     console.log(key, value); 
    }); 
    store_user_char(user_char); 
} 

var store_user_char = function(user_char) { 
    char_obj = user_char; 
    console.log(char_obj); 
    for(var key in char_obj){ 
     if(char_obj.hasOwnProperty(key)){ 
      console.log(key); 
     } 
} 

Welche (in der Theorie) sollte JS-Objekt aus der Firebase-Datenbank erstellen und während er das Schreiben der Daten auf user_char, wird es jeder drucken Schlüssel: Objektpaar in die Konsole. Danach, wenn store_user_char() ausgeführt wird, sollte es auch jeden Schlüssel von vorher ausdrucken.

Die erste console.log() gibt jedes Schlüssel: Objekt-Paar erfolgreich aus, da es in user_char schreibt. Die zweite console.log() gibt das Objekt erfolgreich und ich kann sogar alle Elemente innerhalb klicken und bearbeiten und sieht wie folgt in der Firefox-Konsole:

Object Properties

jedoch die dritte console.log() nie ausgeführt und versuchen, alle Daten von char_obj zu erhalten, indem ein Schlüssel wie so Zugriff auf:

char_obj['KSxpjEvkCOL6ugGkxqn'] 

nichts tut und gibt undefined. Seltsamerweise, wenn ich manuell auf die Objekte in Firefox klicke, kann ich jedes untergeordnete Element analysieren, so dass ich weiß, dass die Daten irgendwo gespeichert werden.

Die einzige Sache, die ich denken kann ist, dass die Anfrage von der Datenbank zu lange dauert, um die Daten zurückzugeben, aber selbst dann die store_user_char() -Funktion sollte ausgeführt werden, nachdem die Daten in user_char gespeichert wurden, so dass ich unglaublich bin verwirrt, warum mein Code scheint nicht durch das Objekt zu iterieren.

Ich habe das Gefühl, dass mir etwas an JS-Objekten fehlt, weshalb mein Code die Daten nicht finden kann, aber ich weiß nicht, was passiert und wie Ich kann auf die Daten zugreifen.

Jede Hilfe in dieser Angelegenheit würde sehr geschätzt werden!

EDIT: Voll def von get_user_data ist wie folgt: asynchron

// Global variables 
var user_email; 
var user_char = {}; 
var uid; 

var get_user_data = function() { 
    // Authenticate current user 
    var user = firebase.auth().currentUser; 

    // Get User Email and char list 
    if (user != null) { 
     user_email = user.email; 
     uid = firebase.auth().currentUser.uid; 
     var getChar = firebase.database().ref('/users/' + uid + '/chars/').orderByKey(); 
     getChar.on('value', function(snapshot){ 
      snapshot.forEach(function(child){ 
       var key = child.key; 
       var value = child.val(); 
       user_char[key] = value; 
      }); 
     }); 
     store_user_char(user_char); 
    } 
} 
+0

Was ist 'user_char' genau? Nur ein normales Objekt? – MinusFour

+0

Meine Vermutung ist, dass hasOwnProperty() Eigenschaften von char_obj, die von user_char geerbt werden, nicht auswertet, da es geerbte Eigenschaften nicht auswertet. – Feathercrown

+0

@Feathercrown char_obj = user_char erstellt eine Referenz von user_char in char_obj, es hat nichts mit Vererbung zu tun. Obwohl Sie richtig sind, gibt hasOwnProperty() für vererbte Eigenschaften false zurück ... – Mannu

Antwort

8
getChar.on('value', function(snapshot){ 
    snapshot.forEach(function(child){ 
     var key = child.key; 
     var value = child.val(); 
     user_char[key] = value; 
    }); 
}); 

aufgerufen wird, Funktionsaufruf store_user_char put (user_char); Inside Callback von getChar und Ihr Problem wird gelöst. Wie:

getChar.on('value', function(snapshot){ 
     snapshot.forEach(function(child){ 
      var key = child.key; 
      var value = child.val(); 
      user_char[key] = value; 
     }); 
     store_user_char(user_char); 
    }); 
+0

Ich denke, du hast recht, ich hatte store_user_char() ; Ausführung außerhalb von getChar. – shstyoo