jquery:执行顺序

时间:2012-09-24 10:03:15

标签: javascript jquery getjson

以下是我的代码:

$(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 个答案:

答案 0 :(得分: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
         }
    });
})

答案 1 :(得分:1)

通常情况下,您可以调用.ajax并使用success命令进行处理,例如:

$.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
  }
});

答案 2 :(得分:0)

将第2行和第3行放在$.getJSON回调中,否则第1行在回调完成后异步执行,而其余的则同步执行。

答案 3 :(得分: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
         }
     });
 });