我有一个问题,主要是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);
}
};
此功能适用于单个请求,但如何在循环中多次调用时可以使其工作?
答案 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方法。如果您正在“循环调用它”,这可能是您的问题。