没有jQuery / JS库的连续Ajax请求

时间:2010-01-04 01:58:16

标签: javascript ajax queue

我有一个问题,主要是IE。

我需要能够一个接一个地处理n个查询。但是,如果我只是在for循环中调用我的函数,IE会做一些奇怪的事情(比如只加载这么多的调用)。 如果我使用一个警告框,它会证明该函数可以获得所有调用,而且令人惊讶的是IT工作!

我的猜测是IE需要比其他浏览器更多的时间,而警报框就是这样。

这是我的代码:

 var Ajax = function(all) {
  this.xhr = new XMLHTTPREQUEST(); // Function returns xhr object/ activeX
  this.uri = function(queries) { // Takes an object and formats query string
   var qs = "", i = 0, len = size(queries);
   for (value in queries) {
    qs += value + "=" + queries[value];
    if (++i <= len) { qs += "&"; }
   }
   return qs;
  };
  xhr.onreadystatechange = function() { // called when content is ready
   if (this.readyState === 4) {
    if (this.status === 200) {
     all.success(this.responseText, all.params);
    }
    this.abort();
   }
  };
  this.post = function() { // POST
   xhr.open("POST", all.where, true);
   xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
   xhr.send(uri(all.queries));
  };
  this.get = function() { // GET
   xhr.open("GET", all.where + "?" + uri(all.queries), true);
   xhr.send();
  };
  if (this instanceof Ajax) {
   return this.Ajax;
  } else {
   return new Ajax(all);
  }
 };

此功能适用于单个请求,但如何在循环中多次调用时可以使其工作?

4 个答案:

答案 0 :(得分:6)

我认为问题可能与大多数Web浏览器实现的2个并发连接限制有关。

看起来您的Web服务响应的延迟使您的AJAX请求重叠,这反过来又超过了2个并发连接限制。

您可能想查看有关此限制的这些文章:

HTTP规范中也建议使用此限制:section 8.14 last paragraph,这可能是大多数浏览器强加它的主要原因。

要解决此问题,您可能需要考虑仅在上一次AJAX调用成功响应后重新启动AJAX请求的选项。这样可以防止重叠发生。请考虑以下示例:

function autoUpdate () {
    var ajaxConnection = new Ext.data.Connection();

    ajaxConnection.request({
        method:         'GET',
        url:            '/web-service/', 

        success: function (response) {
            // Add your logic here for a successful AJAX response.
            // ...
            // ...

            // Relaunch the autoUpdate() function in 100ms. (Could be less or more)
            setTimeout(autoUpdate, 100);
        }
    }
}

此示例使用ExtJS,但您可以非常轻松地使用XMLHttpRequest

答案 1 :(得分:0)

鉴于在大多数浏览器中单个域的限制是2个并发连接,它不会赋予任何速度优势,而是启动超过2个并发请求。启动2个请求,并在每次完成时出列并启动另一个请求。

答案 2 :(得分:0)

我建议限制你的请求,这样你在任何时候都只有少数(4?)未完成。您可能会看到多个请求排队的结果,并在您的代码可以处理所有请求之前超时。只是一个gess。我们有一个ajax库,内置限制并对请求进行排队,因此我们在任何时候只有4个未完成并且没有看到任何问题。我们通常每页q次。

答案 3 :(得分:0)

您的代码看起来像使用构造函数模式放在一起。您是否在调用代码中使用var foo = new Ajax(...)这样的新运算符调用它?或者你只是像var foo = Ajax(...)一样直接调用它?

如果是后者,您可能会在以后的通话中覆盖状态。看起来它被设计为被调用来创建一个对象,在该对象上调用get / post方法。如果您正在“循环调用它”,这可能是您的问题。