2013-04-15 15 views
0

我在執行滯後和腳本時遇到了問題。區間上的Ajax

我有以下代碼:

$(function(){ 
    $("#results").html("Loading work order queue..."); 
    setInterval("showWorkOrders();", 15000) 
}); 

function showWorkOrders() 
{ 
     $.ajax({ 
      url: '/ajax/job_queue_ajax.php', 
      type: 'POST', 
      cache: false, 
      data: 'update=true', 
      success: function(data) 
      { 
       $("#results").html(data); 
       $('span#ref_msg').html(''); 
      }, 
      error: function() 
      { 
       a = new customModal('ajax'); 
       $("#results").html("<font class='msgDivError'>"+a.ajaxError+"</font>"); 
       $('span#ref_msg').html(''); 
      } 
    }); 
} 

我的後端PHP(只是一個例子):

$SQL = MySQL_query("SELECT * FROM table") 
    while($data = MySQL_fetch_array($SQL)) 
    { 
     //// OUTPUTS A TABLE WITH INFORMATION 
    } 

現在,這件事有很多滯後但執行(需要很長的時間加載),並且有時會因爲加載時間過長而創建腳本錯誤。如果我延長刷新間隔,事情會變得更好(滯後),並且我不會收到執行錯誤。我需要一個短暫的時間間隔來滿足我的需求,但我無法弄清楚這樣做的有效方式。有關如何改善這一點的任何建議?

此外,而在於有清涼的頁面後,瀏覽器變到它鎖定點極其緩慢...

+0

我會將輸出保存到PHP頁面的一個變量中,並只在頁面底部輸出一次。另外,請不要在新代碼http://bit.ly/phpmsql中使用mysql_ *函數。它們不再被維護,並且正式被棄用https://wiki.php.net/rfc/mysql_deprecation。 – Revent

+2

那麼你是否開始進行任何調試,以查看整體執行時間滯後的地方?它在你的數據庫查詢中嗎?它在PHP中生成輸出嗎?它在下載那個輸出嗎?您實際發送了多少數據? –

+0

我已經做了一些調試,從我看到它需要32秒加載0.82 KB的數據... – Dimitri

回答

3

我會用setTimeout,而不是解決它:

$(function(){ 
    $("#results").html("Loading work order queue..."); 
    showWorkOrders(); 
}); 

function showWorkOrders() 
{ 
     $.ajax({ 
      url: '/ajax/job_queue_ajax.php', 
      type: 'POST', 
      cache: false, 
      data: 'update=true', 
      success: function(data) 
      { 
       $("#results").html(data); 
       $('span#ref_msg').html(''); 
         setTimeout("showWorkOrders();", 5000) 
      }, 
      error: function() 
      { 
       a = new customModal('ajax'); 
       $("#results").html("<font class='msgDivError'>"+a.ajaxError+"</font>"); 
       $('span#ref_msg').html(''); 
         setTimeout("showWorkOrders();", 5000) 
      } 
    }); 
} 

這意味着,它等待做一個新的Ajax請求之前,前一個可以採取多麼漫長就是了5秒。在再次嘗試之前仍然等待5秒鐘。

+0

最好不要傳遞給'setTimeout()'的字符串。最好傳遞一個方向功能參考。 – jfriend00

3

試試這個。僅在服務器響應後纔開始下一個請求。

$(function(){ 
    $("#results").html("Loading work order queue..."); 
    showWorkOrders(); 
}); 

function showWorkOrders() 
{ 
     $.ajax({ 
      url: '/ajax/job_queue_ajax.php', 
      type: 'POST', 
      cache: false, 
      data: 'update=true', 
      success: function(data) 
      { 
       $("#results").html(data); 
       $('span#ref_msg').html(''); 
      setTimeout(showWorkOrders, 15000); 

      }, 
      error: function() 
      { 
       a = new customModal('ajax'); 
       $("#results").html("<font class='msgDivError'>"+a.ajaxError+"</font>"); 
       $('span#ref_msg').html(''); 
       setTimeout(showWorkOrders, 15000) 
      } 
    }); 
} 
+0

這個答案有什麼問題嗎? –

+0

爲什麼這個答案downvoted? – Anoop

+0

最初發布時,此答案是其他內容。然後,顯然完全改變爲其他兩個答案顯示的內容。 – jfriend00

1

而不是間隔的Ajax,我會建議完成後的下一個Ajax。

由於ajax請求需要花費不確定的時間完成,因此我建議您在第一個請求完成時使用setTimeout()等來觸發下一個ajax請求,這樣您就不會一次發送多個ajax請求因此每個後續的Ajax調用都會從前一個Ajax調用完成時的已知時間開始。

你可能想解決,爲什麼你的服務器是這麼長時間來響應請求,但你也可以擴展爲Ajax調用超時如果你的服務器有時需要很長的時間來作出迴應:

function showWorkOrders() 
{ 
     $.ajax({ 
      timeout: 15000, 
      url: '/ajax/job_queue_ajax.php', 
      type: 'POST', 
      cache: false, 
      data: 'update=true', 
      success: function(data) 
      { 
       $("#results").html(data); 
       $('span#ref_msg').html(''); 
       setTimeout(showWorkOrders, 5000); 
      }, 
      error: function() 
      { 
       a = new customModal('ajax'); 
       $("#results").html("<font class='msgDivError'>"+a.ajaxError+"</font>"); 
       $('span#ref_msg').html(''); 
       setTimeout(showWorkOrders, 5000); 
      } 
    }); 
} 

$(function(){ 
    $("#results").html("Loading work order queue..."); 
    showWorkOrders(); 
}); 
+0

異步方法ftw。 –

+0

@kenansulayman - 你的評論是什麼意思? – jfriend00

+0

考慮到ECMAScript的異步特性,這將是正確的方法 - 問題作者的方法提出了實現同步方式,這對於Internet來說太陌生了。 –

相關問題