注意:简化示例..
我有一个包含 1000 个表格行的页面。对于每一行,我需要通过 AJAX 调用在服务器上“做一些工作”,然后在回调中更新该表行,说完成。
最初我尝试在选择器内触发 1000 个 ajax 请求.each
,但浏览器被锁定。
所以我改变了它来尝试使用一个内部的ajax计数器,所以一次只能触发50个。
这是代码:
$('#do').click(function () {
var maxAjaxRequests = 50;
var ajaxRequests = 0;
var doneCounter = 0;
var toDo = $('#mytable tr').length;
$.each($('#mytable > tr'), function (i, v) {
while (doneCounter < toDo) {
if (ajaxRequests <= maxAjaxRequests) {
ajaxRequests++;
doAsyncStuff($(this), function () {
ajaxRequests--;
doneCounter++;
});
} else {
setTimeout(function() {
}, 1000);
}
}
});
});
function doAsyncStuff(tr, completeCallback) {
$.ajax({
url: '/somewhere',
type: 'POST',
dataType: 'json',
data: null,
contentType: 'application/json; charset=utf-8',
complete: function () {
completeCallback();
},
success: function (json) {
// update ui.
},
error: function (xmlHttpRequest, textStatus, errorThrown) {
// update ui.
}
});
}
但是浏览器仍然被锁定。它永远不会进入$.ajax
完整的回调,即使我可以看到请求成功返回(通过 Fiddler)。因此它只是休眠、循环、休眠等,因为回调永远不会返回。
我有一种感觉,整个doAsyncStuff
函数需要异步?
关于我做错了什么(或者我怎么能做得更好)的任何想法?