2012-02-22 16 views
3

私はJSONを使用しており、応答の要素の数を数えたいと思います。その結果、関数の変数のJS可視性

$.getJSON("/api/getEvents", function(data) { 
     $.each(data, function(key, event) { 
      var count = 10; 
      $.getJSON("/api/getUsers", function(data) { 
       $.each(data, function(key, event) { 
        alert("Value: " + count); 
        count++; 
       }); 
      }); 
      alert("Count: " + count); 
     }); 
    }); 

、私が取得:

Value: 10 
Value: 11 
Value: 12 
... 
Count: 10 

なぜ= 10を数えますか?

+0

これは私が答えとして投稿しているわけではありませんが、$ .getJSONではクロージャを作成して変数カウントへの参照のみをキャプチャすると考えています。 – helpermethod

+0

'getUsers'コールから' data'が空の配列であるように見えます。あなたはカウントを10に設定し、それを0回増分するとCount:10を警告します。 –

+0

@BenLeeいいえ、配列は空ではありません。私はデータから要素の価値を得ることができます。 –

答えて

3

これは、ajaxリクエストが非同期であるためです。 $.getJSONはリクエストを開始するだけですが、javascriptの実行はただちに続きます。あなたは、AJAXコールバックの内側にアラートを移動した場合、カウントを見ることができます:

$.getJSON("/api/getEvents", function(data) { 
    $.each(data, function(key, event) { 
     var count = 10; 
     $.getJSON("/api/getUsers", function(data) { 
      $.each(data, function(key, event) { 
       alert("Value: " + count); 
       count++; 
      }); 

      // I moved this here: 
      alert("Count: " + count); 
     }); 
     // It used to be here. 
    }); 
}); 

ですからvar count = 10設定した後、JavaScriptのパーサは、その後$.getJSONを実行したが、その後すぐにでおり、次の行に進み、あなたのコード例は "Count:10"を警告しました。その後、リクエストが終了するたびに、カウントをインクリメントするコールバックコードが実行され、Value行が警告されます。

+0

私は最初に思ったことはありますが、警告ではあなたが言うところではありません。実際には既にgetJSONコールバックの内部にあります。 – joidegn

+0

@葵、それは質問の間違いでした。私は彼に "バリュー"ラインがどこから来ているのか尋ねた後、OPはそれを修正した。 –

+0

ありがとう、私は理解しています。 –

関連する問題