1

我有一个包含各种社交指标的共享计数的对象。该对象如下所示:

Object{
delicious: 0,
facebook: {
    comments: 0,
    likes: 0,
    shares: 0,
    total: 0,
},
linkedIn: 1,
pinterest: 0,
twitter: 9
}

这是我用来尝试访问我的对象的一些测试代码:

    console.log(bg.results);
    console.log(bg.results["facebook"]);
    console.log(bg.results.facebook);

Object.keys(bg.results).forEach(function(key){
    console.log(bg.results);
    console.log(key + "->" + bg.results[key]);
});

上面的对象是我在控制台中看到的,所以我知道 bg.results 中的字段包含数据。问题是,当我尝试使用点语法或使用 object["key"] 访问这些字段中的任何一个时,我得到一个空字符串作为结果。我搜索并找不到其他遇到同样问题的人。有谁知道为什么会发生这种情况?

一些附加信息:我的代码正在 chrome 扩展的上下文中运行。我正在从弹出页面访问该对象,并且该对象的数据是从我的背景页面提供的。

谢谢您的帮助。

更新

Chrome 处理我的代码的方式发生了一些有趣的事情。bg.results 中的数据由我的后台页面上的一个名为 update 的函数提供。在我的程序中,根据用户的设置,有两种调用更新的方法。当从我的背景页面的上下文中调用 update() 时,一切正常并按预期运行。当从我的弹出页面调用 update() 时,当我尝试访问任何字段时会得到空字符串。

这似乎是一个对于如何处理 chrome 扩展非常特殊的错误,因此专家在这类事情上的任何输入都会很棒。感谢大家的帮助!

4

3 回答 3

0

I've concluded that my values were not completely loaded into the results object when I was trying to access them. I can only speculate as to why I could see the values when I printed the results object to the console (and could not access them at that point) but was not able to access them until later. Below is the solution I used for this problem.

function checkLoaded(results){
    var isLoaded = true;
    $.each(results, function(key, value){
        if(value === "" || value === undefined){
            isLoaded = false;   
        }
    });

    setTimeout(function(){
         if(!isLoaded){
            checkLoaded(results);
         }
         else{
            displayHandler(results);
         }
    }, 500);

}

If anyone knows why I could see the values in the console but could not access them, I'd appreciate an explanation. But otherwise, if anyone else encounters a problem like this, try setting up a delay to make sure that your values are completely loaded into your collection.

于 2013-01-07T17:48:52.990 回答
0

1.)您的代码应该可以工作。facebook 本身就是一个对象,因此您需要考虑这一点,并且可能使用递归函数!

2.) 为什么不使用 for-in-loop 遍历对象属性?

for(key in bg.results) {
   console.log(key);
}

3.) 示例递归函数

function recursiveExample(obj) {
  var current;
  for(key in obj) {
   current = obj[key];
   if(typeof current === 'object' && !Array.isArray(current)) {
     recursiveExample(current);  
   }
   console.log("key: " + key + " - value" + current);
  }
}
于 2013-01-07T00:02:13.000 回答
0

这只是一个猜测(因为您还没有发布任何相关的数据加载代码),但我怀疑您可能正在做这样的事情:

chrome.extension.sendMessage({myAction: "update"}, function(response) {
     bg.results = response;
});

// we try to use bg.results, but the sendMessage callback won't be run until later on
Object.keys(bg.results).forEach(function(key){
    console.log(bg.results);
    console.log(key + "->" + bg.results[key]);
});

传递给的异步回调在当前函数堆栈清除sendMessage运行(即,一旦 JavaScript 线程用完其他事情要做),所以在您尝试使用它之前不会发生。相反,使用回调中的结果:bg.results = response

chrome.extension.sendMessage({myAction: "update"}, function(response) {
     bg.results = response;

    // now it works, because this code is inside the callback
    Object.keys(bg.results).forEach(function(key){
        console.log(bg.results);
        console.log(key + "->" + bg.results[key]);
    });
});

也许您实际上并没有使用chrome.extension.sendMessage,但您必须使用一些异步操作(可能是 Ajax,也可能是另一个 Chrome API 调用)。我不确定该方法是什么,因为您没有发布任何数据加载代码。

于 2013-01-10T01:19:54.327 回答