1

我正在查看一些处理 XHR 的代码。看起来第一个 XHR.send() 正在成功完成,然后下一个在到达 .send() 之前被中止

快速脏污:

url = "http://192.168.1.1/cgi-bin/test.cgi";
data = "1235,123,21,1232,12321,432";
myXHR = new Array();

for(var i = 0; i < 2; i++) {
  myXHR[i] = new XMLHttpRequest();
  myXHR[i].open("POST", url, true);

  myXHR[i].onerror = function() {
   alert("Error occurred");
  };

  myXHR[i].onload = function() {
    if(myXHR[i].status == 200) {
      alert("Yay I worked");
      var data = myXHR[i].responseText;
    }
   };

   // do some setting up of XHR headers

   myXHR[i].send(data);

   myXHR[i] = null;
}

会发生什么会导致 Firebug 在第二个 .send() 完成之前显示 Abort?

4

3 回答 3

0

当我运行此代码时,我得到TypeError: myXHR[i] is undefined(在我的 mac 上安装的股票 firefox 20 上......你在哪个版本上)?

无论如何,我可以看到一个可能也适用于您的问题(即 myXHR[i] 将是未定义的......),特别是:

myXHR[i].onload = function() {
  if(myXHR[i].status == 200) {
    alert("Yay I worked");
    var data = myXHR[i].responseText;
  }
};

因为这是异步触发i的,所以会增加到 2,这当然会超出两个元素myXHR数组的范围。您是否尝试过关闭 的值i,如下所示:

myXHR[i].onload = (function(i) {
  return function() {
    if(myXHR[i].status == 200) {
      alert("Yay I worked");
      var data = myXHR[i].responseText;
    }
  }
})(i);

因为一旦我将该i值正确保存在该函数主体中,此代码将成功用于两个调用。

我知道这不是您遇到的确切问题,但我认为无论如何这都会是一个问题,所以您不妨试一试吧?不幸的是,似乎并没有大量其他答案。

希望这可以帮助..

于 2013-05-23T22:32:31.387 回答
0

发现发生了什么。

XHR 被中止,因为请求发送到的网络服务器没有返回值。Web 服务器是一个基于自定义的服务器,我们似乎正在使用某人更改了代码,因此即使发送给它的数据没有返回数据,它也不会发送 200 Success OK。

现在一切都好。谢谢您的帮助。

于 2013-05-27T20:47:41.577 回答
0

尝试这个:

url = "http://192.168.1.1/cgi-bin/test.cgi";
data = "1235,123,21,1232,12321,432";
var myXHR = [];

for(var i = 0; i < 2; i++) {
  myXHR[i] = new XMLHttpRequest();
  myXHR[i].open("POST", url, true);

  myXHR[i].onerror = function() {
   alert("Error occurred");
  };

  myXHR[i].onload = function() {
    if(myXHR[i].status == 200) {
      alert("Yay I worked");
      var data = myXHR[i].responseText;
    }
   };

   // do some setting up of XHR headers

   myXHR[i].send(data);

   myXHR[i] = null;
}
于 2013-05-23T21:33:28.427 回答