0

可能重复:
等到所有 jquery ajax 请求完成?

我有一个 N 大小的数组。数组的每个元素都需要使用 jquery 通过 ajax 加载。我已经完成了加载逻辑,我现在只是想弄清楚如何一次只加载 10 个(公式应该能够处理更改此值),当 10 个项目通过 ajax 完成加载时,加载接下来的 10 个。这里是我的例子。

我有一个数组的 100 个元素,需要加载前 0-9 个项目,当这 10 个项目完成后,10-19,然后是 20-29 等等。我试图让它尽可能高效,谢谢寻求任何帮助。

尽管这可能完全不对,但我希望我能表达我的观点以获得任何帮助。

//Formula calculation
while(wait till count is complete){

}
function LoadBatch(array){
$.each(array,function(i,item){
$.ajax({
success:function(){
//Maybe a counter here to let loop know when to kick off next batch.
}
});
});
}
4

2 回答 2

1

使用控制流库将使您的生活更轻松。 Aysnc.queue()看起来很合适。它将确保一次不超过 10 个请求处于活动状态。在开始下一次加载之前,它不会等待前 10 个完成。这应该最大限度地减少加载时间,同时限制并发请求。

这是一个例子:

var results = [];
var concurrency = 10;

var q = async.queue(function (task, done) {
  var item = task.item;
  $.ajax({
    success: function(result) {
      // Store results in array with indicies matching the original array.
      // If you don't care about the order of the results you could just 
      // push them on.
      results[task.index] = result;
      done();
  });
}, concurrency);

// push all the array items into the queue, keeping track of the index
$.each(array, function(i, item) {
  q.push({
    index: i,
    item: item
  });
});

// drain will be called when all the requests are done
q.drain = function() {
  console.log(results); // results has all the responses
}
于 2012-10-17T07:25:37.620 回答
0

执行以下操作:

function loadArray(array, batchSize, callback) {
    var length = array.length
    batchSize = length < batchSize ? length : batchSize; // minimum
    var batch = array.slice(0, batchSize); // the current batch
    array = array.slice(batchSize); // the rest of the array

    loadBatch(batch, function (results) {
        if (array.length) { // there are more batches to process
            // load the rest of the array
            loadArray(array, batchSize, function (nextResults) {
                // merge the results - recursion handles the rest
                callback(results.concat(nextResults));
            });
        } else callback(results); // last batch
    });
}

loadBatch功能如下:

function loadBatch(batch, callback) {
    var completed = 0;
    var length = batch.length;
    var results = new Array(length); // the array of results

    $.each(array, function (index, element) {
        $.ajax(element, {
            complete: function (xhr, status) {
                // save the results
                results[index] = {
                    xhr: xhr,
                    status: status
                };

                if (++completed === length) callback(results); // done
            }
        });
    });
}

现在您可以按如下方式加载资源:

loadArray(["a.json", "b.txt", ...], 10, function (results) {
    var a = JSON.parse(results[0]);
    var b = results[1];
    // and so on
});

就是这样。如果您有任何问题,请告诉我。

于 2012-10-17T07:22:32.243 回答