遍历Javascript对象有困难

3

我在访问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);
        }
}

理论上讲,这应该从Firebase数据库中创建JS对象,并在将数据写入user_char时,将每个键:对象对打印到控制台。随后,在执行store_user_char()时,它也应打印出之前的每个键。

第一个console.log()成功输出每个键:对象对,因为它写入了user_char。第二个console.log()成功输出对象,我甚至可以点击并编辑其中的所有元素,并在Firefox控制台中看到以下内容:

Object Properties

然而,第三个console.log()从未执行,并且尝试通过访问键来获取char_obj中的任何数据,如下所示:
char_obj['KSxpjEvkCOL6ugGkxqn']

这段代码什么也不做,并返回undefined。有趣的是,在Firefox中手动点击对象可以让我解析每个子元素,所以我知道数据被存储在某个地方。

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

我觉得我对JS对象还缺少了一些理解,这就是为什么我的代码找不到数据的原因,但我一直在试图找出发生了什么,以及如何访问数据,但一直没有结果。

任何关于这个问题的帮助都将不胜感激!

编辑:get_user_data的完整定义如下:

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

user_char 究竟是什么?只是一个普通对象吗? - MinusFour
@shstyoo 那么它没有任何东西可以评估!var user_char = { bleh: "blah", pingas: ["snoo-","usual I see"], foo: "bar" } var char_obj = user_char; console.log(char_obj); for(var key in char_obj){ if(char_obj.hasOwnProperty(key)){ console.log(key); } } 对我来说是有效的... - Feathercrown
@Mannu 我已经上传了 get_user_data 的完整定义以及正在使用的任何全局变量。 - shstyoo
如果您将测试移除并始终记录第三条消息,会发生什么?这可能会缩小问题的范围。 - JonSG
@JonSG 第三条消息实际上从未被记录。我在循环的第3个语句之前和之后放置了console.log(),只是为了确保代码正在执行,并且能够在console.log(key)之前和之后进行日志记录,但实际的console.log(key)本身并没有执行。 - shstyoo
显示剩余9条评论
1个回答

9
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); 放在 getChar 回调函数内即可解决问题。 示例代码:

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

我认为你是对的,我把store_user_char();放在了getChar之外执行。 - shstyoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接