0

以下は私のコードです:

$(document).on("click",".ball_link", function makeDiv(){
    function fetchLevels(){
        $.getJSON('fetch_level.php',{level: clicked_ball}, function(data) {
        $.each(data, function(i,name) {
                alert(name.level_id); //Line 1
            });
        });
    }
    fetchLevels();
    alert(name.level_id); //Line 2
    while (//some condition){
        alert("hi 2"); //Line 3
    }
});

必要な実行順序:

ライン1

2行目(1行目と同じ値)

3行目

実際の実行順序:

2行目(値:未定義)

3行目

1行目(正しい値)

これらの行の実行順序を制御して、必要な行を正しい値で取得するにはどうすればよいですか?

4

4 に答える 4

3

ajax呼び出しは非同期であるため、成功コールバックですべてのコードを移動するか、遅延オブジェクトを使用して正しい実行順序を処理します

function fetchLevels() {

    $.getJSON('fetch_level.php', { level: clicked_ball })

    .done(function(data) {
        $.each(data, function(i,name) {
            alert(name.level_id); //Line 1
        });

        alert(name.level_id); //Line 2
        while (//some condition) {
            alert("hi 2"); //Line 3
        }
    });
}

fetchLevels();

または、これを使用することもできます

function fetchLevels() { 
    return $.getJSON('fetch_level.php', { level: clicked_ball })
}

$.when(fetchLevels()).done(function(data) {
    $.each(data, function(i,name) {
          alert(name.level_id); //Line 1
    });

    alert(name.level_id); //Line 2
          while (//some condition) {
             alert("hi 2"); //Line 3
         }
    });
})
于 2012-09-24T10:07:09.950 に答える
1

通常、シナリオでは、.ajaxを呼び出し、次のような成功コマンドを使用して処理を行います。

$.ajax({
  url: myUrl,
  dataType: 'json',
  data: myData,
  success: function(data) {
    // do stuff here.
  }
});

提案したようにコーディングを行う必要がある場合は、次のように使用できますasync: false

$.ajax({
  url: myUrl,
  dataType: 'json',
  async: false,
  data: myData,
  success: function(data) {
    // set variable here, then work with it outside the function
  }
});
于 2012-09-24T10:09:04.263 に答える
0

2行目と3行目を$.getJSONコールバック内に配置します。そうでない場合、1行目はコールバックの完了後に非同期で実行され、残りは同期的に実行されます。

于 2012-09-24T10:06:44.067 に答える
0

getJSON非同期です。ロード後に発生したいことはすべて、コールバックに含める必要があります。

$(document).on("click", ".ball_link", function makeDiv() {
     $.getJSON('fetch_level.php', {
         level: clicked_ball
     }, function (data) {
         $.each(data, function (i, name) {
             alert(name.level_id); //Line 1
         });

         fetchLevels();
         alert(name.level_id); //Line 2
         while ( //some condition){
             alert("hi 2"); //Line 3
         }
     });
 });
于 2012-09-24T10:07:46.433 に答える