Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在遍历Javascript对象时遇到问题_Javascript_Firebase_Firebase Realtime Database_Javascript Objects - Fatal编程技术网

在遍历Javascript对象时遇到问题

在遍历Javascript对象时遇到问题,javascript,firebase,firebase-realtime-database,javascript-objects,Javascript,Firebase,Firebase Realtime Database,Javascript Objects,我在访问JS对象中的数据时遇到了一个问题。收集数据(来自Firebase数据库)的代码如下所示: var get_user_data = function() { ... snapshot.forEach(function(child){ var key = child.key; var value = child.val(); user_char[key] = value; console.log(key, val

我在访问JS对象中的数据时遇到了一个问题。收集数据(来自Firebase数据库)的代码如下所示:

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);
        }
}
// 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);
    }
}
它(理论上)应该从Firebase数据库创建JS对象,并在将数据写入用户_char时,将每个key:object对打印到控制台中。之后,当store_user_char()执行时,它还应该打印出之前的每个键

第一个console.log()在写入user_char时成功输出每个key:object对。第二个console.log()成功输出对象,我甚至可以单击并编辑其中的所有元素,在Firefox控制台中如下所示:

但是,第三个console.log()从未执行,并尝试通过访问如下键从char_obj获取任何数据:

char_obj['KSxpjEvkCOL6ugGkxqn']
不执行任何操作,返回未定义的。奇怪的是,在Firefox中手动单击对象可以解析每个子元素,这样我就知道数据存储在某个地方

我能想到的唯一一件事是,来自数据库的请求可能需要很长时间才能返回数据,但即使如此,store_user_char()函数也应该在数据存储到user_char后执行,因此我非常困惑为什么我的代码似乎无法遍历对象

我觉得我好像缺少了一些关于JS对象的东西,这就是为什么我的代码找不到数据的原因,但是我一直在试图弄清楚到底发生了什么,以及如何访问数据

在此问题上的任何帮助都将不胜感激

编辑:get_用户_数据的完整定义如下:

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);
        }
}
// 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);
    }
}
将被异步调用,put函数调用store\u user\u char(user\u char);在getChar的内部回调中,您的问题将得到解决。 比如:


什么是
user\u char
?只是一个普通对象?我猜hasOwnProperty()不会计算从user\u char继承的char\u obj的属性,因为它不会计算继承的属性。@Feathercrown char\u obj=user\u char将user\u char的引用创建到char\u obj中,这与继承无关。虽然hasOwnProperty()对于继承的属性返回false是正确的…但是Yes@MinusFour将其初始化为var user_char={}@shstyoo那么它就没有任何可评估的东西了<代码>var user_char={bleh:“blah”,pingas:[“snoo-”,“通常我看到”],foo:“bar”}var char_obj=user_char;console.log(char_obj);for(char_obj中的var key){if(char_obj.hasOwnProperty(key)){console.log(key);}}对我有效……我想你是对的,我有store_user_char();在getChar之外执行。