2017-01-29 2 views
0

つぶやきの情報を含むJSONファイルがあり、各ツイートの生のテキストを配列に取り込もうとしています。セットには95のつぶやきがあるので、配列には95個のアイテムが必要です(各アイテムはツイートの生のテキストを含む文字列になります)。jQueryのスコープ - なぜ配列が設定されていないのですか?

は、ここに私のコードです:

// Declaring array to hold tweets 
allTweets = new Array(); 

$(document).ready(function() { 
    // Going through JSON file to get raw text from tweets 
    $.getJSON("TwitterTweets17.json", function(data) { 
    $.each(data, function(key, val) { 
     $.each(val, function(key2, val2) { 
      // Only getting raw text from tweets, no other info 
      if (key2 === "text") { 
      allTweets.push(val2); 
      } 
     }); 
    }); 
    }); 

    console.log("allTweets length: " + allTweets.length); 

    for (i = 0; i < allTweets.length; i++) { 
     console.log(allTweets[i]); 
    } 
}) 

私はこのコードを実行すると、私はコンソールでこの出力を得る:これは私にはあまり意味がありません

allTweets length: 0 

を。私はallTweets配列を私ができる限りグローバルに宣言しましたが、配列が移入されているようには見えません。 console.logとforループを$(document).ready関数の外に移動しても、出力は変更されません。なぜこうなった?

ありがとうございます。

編集:

// Declaring array to hold tweets 
allTweets = new Array(); 

$(document).ready(function() { 
    // Going through JSON file to get raw text from tweets 
    $.getJSON("TwitterTweets17.json", function(data) { 
    $.each(data, function(key, val) { 
     $.each(val, function(key2, val2) { 
     // Only getting raw text from tweets, no other info 
     if (key2 === "text") { 
      allTweets.push(val2); 
     } 
     }); 
    }); 

    console.log("allTweets length: " + allTweets.length); 

    for (i = 0; i < allTweets.length; i++) { 
     console.log(allTweets[i]); 
    } 
    }); 
}) 

そして、これはおおよそのコンソール出力です:

allTweets length: 95 
RT @1942bs: "why don't y'all just give Trump a chance" 
RT @JuddLegum: Trump said the exact same thing and was elected president. 
... 

この質問をより徹底するためには、ここで私が欲しいの出力が得られないことに、代替のコードがあります等々。基本的にはすべてのつぶやきを表示します。だから私は私の質問は、なぜこの場合は動作しますが、前のことではないと思いますか?

+0

jsonデータも表示してください。 – Shibi

+0

申し訳ありませんが、私の質問は十分にはっきりしていないと思います。私はJSONの問題だとは思っていません。私の(編集した)答えでは、正しい出力が得られるケースを示しているからです。私の質問です:なぜ、2番目のケースは機能しますが、最初のケースは機能しませんか?ありがとう。 –

+0

最初の例では、JSONがロードされて配列が移入された後、_success_ハンドラにツイートが表示されます。次に、GetJSONを呼び出すと成功ハンドラが配列に値を設定しますが、ツイートが実際にロードされて配列にプッシュされる前に、すぐにallTweetsの出力を表示し続けます。 – Mun

答えて

0

これは、getJSONがajax呼び出しであり、同期XMLHttpRequestであるため、asyncをオフにすることができます。falseこれをコードの上に置きます。

$.ajaxSetup({ 
    async: false 
}); 

これはグローバルにすべてのajax呼び出しです。代わりに$.ajaxを使用してasync:この呼び出しをfalseにするだけです。

$.ajax({ 
    type:'GET', 
    url:'TwitterTweets17.json', 
    dataType:'json', 
    async:false, 
    success:function(data){ 
     $.each(data, function(key, val) { 
      $.each(val, function(key2, val2) { 
       // Only getting raw text from tweets, no other info 
       if (key2 === "text") { 
       allTweets.push(val2); 
       } 
      }); 
     }); 
    } 
}); 
+0

これはうまくいきます。どうもありがとう! –

関連する問題