批量使用JavaScript加载数组

13 浏览
0 Comments

批量使用JavaScript加载数组

这个问题已经有了答案:

可能重复:

等待所有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.
}
});
});
}

admin 更改状态以发布 2023年5月25日
0
0 Comments

按照以下步骤进行操作:

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
});

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

0
0 Comments

使用控制流程库会让你的生活更容易。 Async.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
}

0