2014-10-16 111 views
1

我有一個動態的AJAX函數,它有許多不同的模式(我稱這個函數爲不同的參數,並通過switch-case來檢查使用哪種模式),但是當我用不同的參數直接調用AJAX函數時,相同的XMLHttpRequest似乎第二個請求覆蓋第一個請求。AJAX請求是否會覆蓋另一個請求?

這可能嗎?

這裏是我的功能(EDIT)一個例子:

$(function() { 
    ajax("test_1"); 
    ajax("test_2"); 
}); 

function ajax(mode) 
    { 
     switch (mode) 
     { 
      case "test_1": 
       request = null; 
       if (window.XMLHttpRequest) { 
        request = new XMLHttpRequest(); 
       } else if (window.ActiveXObject) { 
        try { 
         request = new ActiveXObject('Msxml2.XMLHTTP'); 
        } catch (e) { 
         try { 
          request = new ActiveXObject('Microsoft.XMLHTTP'); 
         } catch (e) { 
         } 
        } 
       } 
       if (!request) { 
        console.log("Kann keine XMLHTTP-Instanz erzeugen"); 
        return false; 
       } else { 
        var url = "../ajax.php"; 
        request.open('POST', url, true); 
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
        request.send('ajax_mode=test&request_mode=test_1'); 
        request.onreadystatechange = function() { 
         if (request.readyState === 4) 
         { 
          interpretRequest_test_1(); 
         } 
        }; 
       } 
       break; 
      case "test_2": 
       request = null; 
       if (window.XMLHttpRequest) { 
        request = new XMLHttpRequest(); 
       } else if (window.ActiveXObject) { 
        try { 
         request = new ActiveXObject('Msxml2.XMLHTTP'); 
        } catch (e) { 
         try { 
          request = new ActiveXObject('Microsoft.XMLHTTP'); 
         } catch (e) { 
         } 
        } 
       } 
       if (!request) { 
        console.log("Kann keine XMLHTTP-Instanz erzeugen"); 
        return false; 
       } else { 
        var url = "../ajax.php"; 
        request.open('POST', url, true); 
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
        request.send('ajax_mode=test&request_mode=test_2'); 
        request.onreadystatechange = function() { 
         if (request.readyState === 4) 
         { 
          interpretRequest_test_2(); 
         } 
        }; 
       } 
       break; 
     } 
    } 

    function interpretRequest_test_1() { 
     if (request.status != 200) { 
      console.log("Error"); 
     } else { 
      alert("1"); 
     } 
    } 
    function interpretRequest_test_2() { 
     if (request.status != 200) { 
      console.log("Error"); 
     } else { 
      alert("2"); 
     } 
    } 
+4

查看瀏覽器控制檯網絡選項卡。這兩個請求都正在進行,您如何處理響應可能是問題,但提供的代碼不會告訴我們任何事情 – charlietfl 2014-10-16 12:03:40

+0

您的模式切換功能必須與ajax響應同步。否則它會失敗。 – 2014-10-16 12:09:06

回答

3

request變量不使用var關鍵字,這使得它成爲全球性,因此要重複使用同一個XHR對象定義。

如果您重複使用相同的XMLHttpRequest對象,那麼會返回,如果您嘗試使用另一個請求,而另一個請求正在進行中,它將中止先前的請求。

在您的switch語句中,使用var關鍵字定義request。這使變量的作用域爲本地作用域,而不是全局作用域。

switch (mode) { 
    case "test_1": 
     var request = null; 
     ... 
    case "test_2": 
     var request = null; 
     ... 
} 

或者只是在函數的頂部而不是在每個case語句中執行一次。

,如果你有一個全局對象一個更簡單的例子:

var xhr = new XMLHttpRequest(); 

function do_smth(){ 
    xhr.open(...); 
} 

function do_smth2(){ 
    xhr.open(...); 
} 

do_smth(); 
do_smth2(); 

取而代之的是全球性的,你需要做XHR對象範圍的適當所以每次通話都有一個唯一的XHR。

function do_smth(){ 
    var xhr = new XMLHttpRequest(); 
    xhr.open(...); 
} 

function do_smth2(){ 
    var xhr = new XMLHttpRequest(); 
    xhr.open(...); 
} 
+0

我的請求變量是全局定義的。 – Snickbrack 2014-10-16 12:19:22

+1

是的,你需要在case語句中使用'var request = null;'。 – MrCode 2014-10-16 12:20:41