我目前有以下代码,它将运行一堆ajax请求(40-50)然后再次执行它们。 (基本上永远这样做)
代码:
$(document).ready(function () {
window.setInterval(function () {
$('div.env').each(function (index, item) {
var vm = $(item).text();
var env = "http://localhost:56656/HTML" + vm + ".htm";
$.ajax(env, {
async: false,
URL: env,
type: "GET",
dataType: "html",
success: function (data) {
//alert("Colouring");
var style = $(data).filter('div').attr('style');
var styleObj = {};
$.each(style.split(';'), function () {
var rule = this.split(':');
styleObj[$.trim(rule[0])] = $.trim(rule[1]);
});
$(item).css('background', styleObj.background);
},
error: function () {
$(item).css('background', '#f00');
}
});
});
}, 10000);
});
正如您所看到的,我目前正在使用在IE上运行速度特别慢的Timeout,有时在Chrome上运行缓慢。当我说慢时,我的意思是所有的ajax请求都将完成,然后屏幕将刷新更新。这是IE的情况,偶尔也是Chrome。理想情况下,我希望ajax执行其请求,然后更新然后执行下一个ajax请求。
有没有更好的方法来持续进行AJAX请求?
提前谢谢你, 詹姆斯
答案 0 :(得分:1)
您可能想要使用Caolan's async library。您的代码可能如下所示(当然包括async.js
之后):
$(document).ready(function () {
function call() {
var calls = [];
$('div.env').each(function (index, item) {
calls.push(function(callback) {
$.ajax({
// DO NOT USE async: false!!!!
// some ajax settings
complete : function() {
callback();
}
});
});
});
async.parallel(calls, function() {
/* This will fire when every call finishes.
You may want to add timeout here, or else
you will end up flooded with requests. */
call();
});
};
});
您应该根据需要进行调整(async
也可以处理错误,请阅读文档)。你说你希望他们一个接一个地开火,所以使用async.series
而不是async.parallel
。
BTW这段代码:
$.ajax({
async: false
PURE EVIL !!! 阻止所有其他脚本甚至整个浏览器!这可能是你“缓慢而眨眼”问题的原因。
答案 1 :(得分:0)
不确定你的情况是否可行,但是像SignalR或Node.Js + Socket.IO这样的websocket / long轮询解决方案通常比连续轮询更好。
答案 2 :(得分:0)
您应该使用setTimeout()
代替setInterval()
并执行以下操作:
setTimeout()
答案 3 :(得分:0)
我认为这是一个架构问题,而不是其他任何问题。
我建议重建结构以将数组发送到服务器,并将响应发送到一个html页面或json object
原因很明显,无论你做什么,40-50个并发的ajax请求请求最明确地总是很慢,因为即使你的ajax成功处理程序(你绑定的功能)成功)是在10ms内完成的(由于它的复杂性肯定不在IE上),40个请求意味着至少400ms独占时间,导致客户端性能问题。在你的情况下,
async: false
甚至将请求时间添加到该独占时间,因此如果您的请求在10毫秒内完成(极不可能),则使用另外400毫秒的客户端独占时间。
因此,在客户端搜索解决方案并非真正的选择。