簡體   English   中英

優化ajax同步調用

[英]Optimize ajax synchronously calls

我有一些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 ,同樣的過程發生到最后。 我如何優化此腳本,我不希望瀏覽器顯示選項來停止此腳本。 請幫忙。

謝謝

嘗試這個:

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,直到所有這些URL被消耗, (requests.length == 0) ,您調用最終請求。

這樣,用戶仍然可以在頁面上執行其他操作,並且您可以在每次請求完成時顯示進度。 此外,一件好事是,您可以一次或多次撥打2個電話,以加快處理速度。

Ajax調用需要很長時間才能完成,因為它與遠程服務器通信。 最慢的是對服務器的查詢。 您應該發送一個批處理請求,其中包含服務器所需的所有數據,應該將數據分開並處理它。 一切都應該完成大約250倍的速度。

為每個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); 

                  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM