使用jQuery处理JSON数据 - 需要alert()的奇怪结果

时间:2010-06-11 22:50:44

标签: jquery ajax json

我在下面有这个代码。我随机跑过去,如果我有那个警报信息确切的位置它会工作。如果我将其取出或移动到任何其他位置,标签将不会出现。

该警报究竟是做什么的,这使得代码能够正常工作,如何在没有警报的情况下使其工作?

$.ajax({
   type: "GET",
   url: "../ajax.php",
   data: "action=tabs",
   dataType: "json",
   success: function(Projects){
     $.each(Projects, function(i){

        /* Sequentially creating the tabs and assigning a color from the array: */
        var tmp = $('<li><a href="#" class="tab green">'+Projects[i].name+'<span class="left" /><span class="right" /></a></li>');

        /* Setting the page data for each hyperlink: */
        tmp.find('a').data('page','../ajax.php?action=lists&projectID='+Projects[i].project_id);

        /* Adding the tab to the UL container: */
        $('ul.tabContainer').append(tmp);

    });
   }
 });
    alert("yes");

ajax代码使用此代码重新调整json

        $query = mysql_query("SELECT * FROM `projects` ORDER BY `position` ASC");

    $projects = array();

    // Filling the $projects array with new project objects:

    while($row = mysql_fetch_assoc($query)){
        $projects[] = $row;
    }

    echo json_encode($projects);

返回的数据非常小且非常快,所以我认为不是问题。

2 个答案:

答案 0 :(得分:3)

这是因为Ajax请求是 Asynchronous 。它们与主脚本一起运行,并且在您执行$.each(Projects, function(i)时不一定完成。

显示并点击alert()会为脚本提供足够的时间来获取数据,这就是为什么它似乎以这种方式工作的原因。

您需要将完整的过程放入success回调:

 success: function(data){
       Projects = data; 
       $.each(Projects, function(i){
         ........... // do all the stuff

   }

答案 1 :(得分:2)

AJAX是异步的!所以ajax请求的成功处理程序在执行其余代码后执行。通过添加alert(),您可以阻止代码足够长的时间,以便执行成功处理程序。只需将代码移动到您完成的处理程序中即可。