2011-10-12 82 views
1

我有一個表,其中每一行都有一個觸發AJAX調用的按鈕。調用相同的功能但不同的參數。結果顯示在與調用相同的行中。同一個js函數可以同時進行AJAX調用嗎?

該通話可以提高速度,因此可能需要一分鐘左右的時間。我可以觀察到,如果我在前一個完成之前發起新的AJAX呼叫,我將失去呼叫的結果。

有什麼辦法可以我可以在同一個時間運行多個AJAX調用,並從調用中獲得結果並顯示它們?

  • 使用jQuery
  • 同一瀏覽器窗口
  • 調用PHP

HTML代碼調用JavaScript的

<button type="button" onclick="update_revision(\'' . $directory . '\',\''.$server_name.'\')" > update </button> 

的Javascript

function update_revision(revision,server_name) 
    { 
     if (window.XMLHttpRequest) 
     {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
     } 
     else 
     {// code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     xmlhttp.onreadystatechange=function() 
     { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
      { 
      document.getElementById("rev."+revision).value="updated to "+update_to; 
      } 
     } 
     xmlhttp.open("GET","https://"+server_name+"/imacs/radek/svn_update.php?code_base="+revision+"&revision="+update_to+"&t=" + Math.random(),true); 
     xmlhttp.send(); 
    }   
+1

只需停止使用全局變量。您可以覆蓋'xmlhttp',這樣每當您的XHR對象的狀態發生變化時,'onreadystatechange'就會檢查您創建的* last *的條件。 – Quentin

+0

@Quentin:你能詳細解釋一下嗎?我不明白... – Radek

回答

3

問題是,您正在使用單個全局變量來存儲所有的XMLHttpRequest實例。無論何時創建新實例並將其引用存儲在全局變量xmlhttp中,之前引用的以前的實例都會變爲未引用,因此只要瀏覽器認爲合適,它就會被垃圾收集。通常這意味着它立即被垃圾收集;在你的情況下,即使在收到待處理的響應之前,它也會被垃圾收集。

解決此問題的一種方法是在update_revision()函數中聲明xmlhttp作爲局部變量。就像這樣:

function update_revision(revision, server_name) { 
    // declare xmlhttp locally 
    var xmlhttp; 

    if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp = new XMLHttpRequest(); 
    } 
    else { // code for IE6, IE5 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState == 4) { 
      if(xmlhttp.status == 200) { 
       document.getElementById("rev." + revision).value = "updated to " + update_to; 
      } 

      // explicitly drop the reference when 
      // we're done with it, so the browser will reclaim the object 
      // (this is optional, but it's a good idea) 
      xmlhttp = null; 
     } 
    } 
    xmlhttp.open("GET", "https://" + server_name + "/imacs/radek/svn_update.php?code_base=" + revision + "&revision=" + update_to + "&t=" + Math.random(), true); 
    xmlhttp.send(); 
} 

注:

  1. xmlhttp被聲明爲一個局部變量

  2. xmlhttp被 「歸零」 的時候,我們不需要它了(的readyState == 4後)。這將導致瀏覽器垃圾收集請求實例,從而防止資源泄漏。這是一個很好的做法(所以我已經在上面的例子中展示了它),但從技術上講它是可選的。

+0

很好的解釋。不,我明白了。如果我使用jQuery而不是純粹的JavaScript呢? – Radek

相關問題