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 回答