注: 簡略化された例..
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
関数全体を非同期にする必要があると感じていますか?
私が間違っていることについてのアイデアはありますか (または、これを改善するにはどうすればよいですか)?