【问题标题】:jquery : Order of executionjquery:执行顺序
【发布时间】:2012-09-24 10:03:15
【问题描述】:

以下是我的代码:

$(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 行(正确值)

我如何控制这些行的执行顺序以获得具有正确值的所需行?

【问题讨论】:

标签: javascript jquery getjson


【解决方案1】:

由于 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
         }
    });
})

【讨论】:

    【解决方案2】:

    通常在您的场景中,您会调用 .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
      }
    });
    

    【讨论】:

    • 第二个会,是的,我建议不要使用第二个选项。第一个选项是我要解决的方法。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-16
        • 2016-12-01
        • 1970-01-01
        相关资源
        最近更新 更多