2014-10-16 60 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