2012-03-23 15 views
0

我正在使用ajax請求來填充用戶已填寫數據的模式彈出窗口。彈出窗口只是我顯示/隱藏jQuery的div佈局。這個過程肯定會有一些延遲。由於彈出窗口等待數據被檢索,因此用戶流量很容易等待發生的4秒鐘。所以我提出了彈出窗口,比我做ajax調用。在數據被填充時,這裏有幾秒的滯後時間。我不確定預填充數據是否有意義,因爲根據用戶的操作,有很多不同數據組合的可能性。被調用的查詢都非常簡單。加快Ajax/JavaScript,檢索數據時,目前太多滯後。必須有更好的方法

我知道必須有更好的方法來做到這一點。而且我知道這並沒有幫助,而是在1次調用中返回所有可靠的類定義,而每次我需要檢索數據時都會調用一些調用。但通過了,我不知道我該怎麼做。

這是許多例子之一。我會讓Ajax調用就像這樣:

openPopup(); 

      Ext.Ajax.Request({ 
       action: 'retrieve_last_config', 
       stage_id: stage_id, 
       success_fn: function(response) { 
        Ext.each(response.config_data, function(result) { 
         if(result != null) { 
          $('#stage-due-date').html(result.date_due); 
          $('#stage-email-body').html(result.email_body); 
         } 
        }); 
       } 
      }); //end ajaxRequest 

以上是傳遞一個id,看起來像這樣的功能:

function retrieve_last_config($request) { 

$last_config = stage_config::getLatest($request->db, "WHERE stage_id='{$request->stage_id}'"); 

foreach ($last_config as $config) { 
    $config_data[] = array(
     'id' => $config->id, 
     'stage_id' => $config->stage_id, 
     'template_id' => $config->template_id, 
     'date_due' => convertDateFormat($config->date_due), 
     'email_body' => $config->email_body, 
     'send_email' => $config->send_email, 
     'create_date' => convertDateFormat($config->create_date), 
    ); 

} 

return json_encode(array('status' => 'OK', 'config_data' => $config_data)); 
} 

我很樂意挖得更深,帶班定義等。但我認爲這將給予足夠的想法。就我的方法而言,我有沒有辦法脫離基地?任何幫助表示讚賞,謝謝!

回答

2

高級方法很好。對於性能問題,您可以從開始,測量時間用於。沒有這些細節,我們都可以推測,但是無論如何你要真正衡量所有這些。你想

問題回答:

  • 多少時間是花在檢索服務器上的數據?
  • 花了多少時間做json_encode?
  • 有多少數據通過電匯?
  • 需要多長時間?

回答這些問題,你就會知道要解決什麼問題。

+0

謝謝,Larsenal。偉大的建議,我現在會通過這個! – mstef 2012-03-23 18:39:46

2

您首先必須確定延遲的位置。使用瀏覽器調試程序,如Firebug,打開NET選項卡並啓動AJAX調用。您需要確定延遲是在提取還是渲染中。

您可能需要優化數據庫索引,但直到看到延遲的位置時纔會知道。

+0

很好,我住在firebug中,但是從來沒有做過這樣的數據庫調用調試。謝謝! – mstef 2012-03-23 18:39:23

+1

良好的答案值得一票。 – 2012-03-23 18:42:50

+0

我同意,對不起就這樣做了。 – mstef 2012-03-23 18:53:29

1

首先找到每個操作的時間統計信息。

  • 如果您使用任何JS循環再「每個」循環比正常的「for循環」慢,你可能想看看這個http://jsperf.com/jquery-each-vs-for-loop/73
  • 此外,當你擁有的數據和邏輯哪裏您正在填充模式窗口,請嘗試使用像setTimeout('insertRow()',0);這樣的setimeout,這會將調用添加到瀏覽器事件循環並提高性能。 - 如果有很多數據需要讀取,那麼也許你可以批量加載數據。
  • 此外,您可以緩存通過ajax獲取的數據
  • 您也可以嘗試使用網絡套接字,因爲它們速度更快,但是看看它們是否最適合您的場景。
+0

太好了,非常感謝Abhidev! :) – mstef 2012-03-23 19:26:58

相關問題