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という関数によって提供されます。私のプログラムでは、ユーザーの設定に応じて更新を呼び出す方法が2つあります。バックグラウンドページのコンテキスト内からupdate()を呼び出すと、すべてが正常に機能し、期待どおりに動作します。ポップアップページからupdate()を呼び出すと、フィールドにアクセスしようとすると空の文字列が表示されます。

これは、Chrome拡張機能の処理方法に非常に特有のバグのように思われるため、この種の専門家からの入力は素晴らしいものになります。みんな助けてくれてありがとう!

4

3 に答える 3

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

に渡される非同期コールバックは、現在の関数スタックがクリアされた(つまり、JavaScriptスレッドが他の処理を使い果たした後)に実行されるためsendMessage、使用を試みるまで発生しません。代わりに、コールバック内の結果を使用してください: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 に答える
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

値にアクセスしようとしたときに、値が結果オブジェクトに完全にロードされていなかったと結論付けました。結果オブジェクトをコンソールに出力したときに値が表示された(そしてその時点で値にアクセスできなかった)理由について推測することしかできませんが、後でまで値にアクセスできませんでした。以下は、この問題に使用した解決策です。

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

}

コンソールに値が表示されたのにアクセスできなかった理由を誰かが知っている場合は、説明をいただければ幸いです。ただし、そうでない場合は、他の誰かがこのような問題に遭遇した場合は、遅延を設定して、値がコレクションに完全に読み込まれるようにしてください。

于 2013-01-07T17:48:52.990 に答える