优化ajax同步调用

时间:2012-09-06 18:14:26

标签: php javascript ajax

我有一些ajax脚本可以触发大约250个同步PHP调用。这是我的剧本

$(document).ready(function(){ 
      $("#generate").html("<div class='modal'><p>Initializing...</p></div>");
      $.ajax({
          url:'/fetch around 250 url from database.php',
          async:false,
          dataType: 'json',        
          success: function(data){      
               $.each(data,function(key,val){
                    $("#generate").html("<div class='modal'><p>Fetching "+val.url+"</p></div>");
                    saveimage(val.url); 
              }
              $("#generate").html("<div class='modal'><p>done</p></div>");    
                    finalcreate();
          },
     });
   });
   function saveimage(){
        $.ajax({
             url: 'do some php work.php',
             async: false,
        });
    }
    function finalcreate(){
        $.ajax({
             url: 'do some php work.php',
             async: false,
         });
    }

在第一部分脚本中,从数据库中获取超过250个url,并且对于每个url脚本,使用另一个ajax调用进行一些php计算。当循环结束脚本时,做最后的ajax调用。

当我在firefox中运行此程序时,它仅成功运行40个url,然后浏览器显示对话框,其中包含用户是否要停止此脚本的选项,如果用户想要运行此脚本,则脚本再次运行接下来的40个网址,同样的过程发生到最后。 我如何优化此脚本,我不希望浏览器显示选项来停止此脚本。请帮忙。

由于

3 个答案:

答案 0 :(得分:2)

试试这个:

function nextrequest() {
    if (requests.length == 0) {
        $("#generate").html("<div class='modal'><p>done</p></div>");
        finalcreate();
        return;
    }
    var val = requests.pop();
    $("#generate").html("<div class='modal'><p>Fetching "+val.url+"</p></div>");
    saveimage(val.url);
}
var requests = [];
$(document).ready(function(){
  $("#generate").html("<div class='modal'><p>Initializing...</p></div>");
  $.ajax({
      url:'/fetch around 250 url from database.php',
      dataType: 'json',
      success: function(data){
        requests = data;
           nextrequest();
      },
 });
});
function saveimage(){
    $.ajax({
         url: 'do some php work.php',
         success: function(data) {
            // do something...
            nextrequest();
         }
    });
}
function finalcreate(){
    $.ajax({
         url: 'do some php work.php',
     });
}

您将所有网址存储在一个全局变量中,每次请求完成后,您都会获得下一个网址,直到所有网址被消费,(requests.length == 0),您才会调用最终请求。

这样,用户仍然可以在页面上执行其他操作,并且您可以在每次请求完成时显示进度。此外,一件好事是,您可以一次或多次拨打2个电话,以加快处理速度。

答案 1 :(得分:0)

Ajax调用需要很长时间才能完成,因为它与远程服务器通信。最慢的是对服务器的查询。您应该发送一个批处理请求,其中包含服务器所需的所有数据,应该将数据分开并处理它。一切都应该完成大约250倍。

答案 2 :(得分:0)

为每个ajax请求设置一些时间间隔

 success: function(data){      
                   $.each(data,function(key,val){
                        $("#generate").html("<div class='modal'><p>Fetching "+val.url+"</p></div>");
                        setTimeout(saveimage(val.url),3000); 

                  }