2012-10-09 63 views
1

我有以下代码: 里面我把2 alert()进行调试。 为什么alert2在alert1之前显示?jquery同步问题

<script language="javascript" type="text/javascript"> 
    $(document).ready(function() { 

     $.ajax({ 
      type: "POST", 
      url: "ManagerBaseKit.aspx/GetDummyVersions", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (result) { 
       var items = []; 
       $.each(result.d.Version, function (key, val) { 
        items.push('<li id="' + key + '">' + val + '</li>'); 
       }); 
       $('<ol/>', { 
        'id': 'selectable', 
        html: items.join('') 
       }).appendTo('.baseVersionsTest'); 
       alert('1'); // should be alerted 1st 

      } 
     }); 

     alert('2'); // should be alerted 2nd 

    }); 

</script> 

编辑: 我怎样才能使$.ajax被称为第一件事情?

+6

因为$阿贾克斯是异步的,成功的功能将调用上 – Anoop

+0

良好读取该服务器响应的回报:http://jqfundamentals.com/chapter/ajax-deferreds – m90

+0

我可以做$就成为网页上的第一件事?我的代码依赖于其余部分。我可以让它同步吗? – user829174

回答

2

当文档准备好并且Alert1在成功的ajax请求后触发时,触发Alert2。你的代码可以重新写成如下形式:

<script language="javascript" type="text/javascript"> 
    $(document).ready(function() { 
    alert('2'); // Still the same functionality 

     $.ajax({ 
      type: "POST", 
      url: "ManagerBaseKit.aspx/GetDummyVersions", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (result) { 
       var items = []; 
       $.each(result.d.Version, function (key, val) { 
        items.push('<li id="' + key + '">' + val + '</li>'); 
       }); 
       $('<ol/>', { 
        'id': 'selectable', 
        html: items.join('') 
       }).appendTo('.baseVersionsTest'); 
       alert('1'); // should be alerted 1st 

      } 
     }); 



    }); 

</script> 

现在你可以看到为什么警报2首先触发(和文件准备好)

+0

感谢您的回答,我如何让$ .ajax被称为第一件事? – user829174

+0

也许你可以尝试在你的ajax查询中添加'async:false'。看看API http://api.jquery.com/jQuery.ajax/ – RRikesh

0

您可以通过设置异步/异步方式调用AJAX功能同步如真或假。

$.ajax({ 
url : yourURL, 
async : false, 
... 
});