0

我有一些 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 个 url ,相同的过程发生到最后。我如何优化这个脚本,我不希望浏览器显示选项来停止这个脚本。请帮忙。

谢谢

4

3 回答 3

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

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

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

于 2012-09-06T18:29:24.430 回答
0

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

于 2012-09-06T18:19:06.370 回答
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); 

                  }
于 2012-09-06T18:29:58.750 回答