批量使用JavaScript加载数组
批量使用JavaScript加载数组
这个问题已经有了答案:
可能重复:
我有一个大小为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日
按照以下步骤进行操作:
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 });
就是这样。如果您有任何问题,请告诉我。
使用控制流程库会让你的生活更容易。 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 }