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 に答える