14

API Async から一連のデータをロードしようとしています。すべてのデータがロードされたら、すべてのデータがロードされたというイベントをトリガーしたいと考えています。私が抱えている問題は、使用している API が応答オブジェクトの数を 5 つに制限していることです。そして、30 ~ 40 個の応答オブジェクトを取得する必要がある可能性があります。

だから私がしたいのは、データ項目をループし、5 つの項目ごとに要求を行う when - then ステートメントを作成し、すべての項目が読み込まれたときに、読み込まれたイベントを発生させたいということです。私が抱えている問題は、ajax リクエストが成功する前に when-then ステートメントが完了していることです。

私が試したコードに。

 function loadsLotsOfStats(stats, dataType, eventName, dataName, callback) {
     var groupedStats = [];
     while (stats.length > 0) {
         groupedStats.push(stats.splice(0, 5).join('/'));
     }
    j$.when(
        groupedStats.forEach(function (d) {
            loadJSONToData(model.apiUrl.replace("{IDS}", d), "json", "", dataName, function (d) { /*console.log(d);*/ }, true)
        })
    ).then(function () {
        j$(eventSource).trigger('dataLoaded', eventName);
    });

loadJSONToData 関数は基本的に、Async $.ajax の単なるラッパー関数です。

そうそう、データが実際にロードされる前にイベントがトリガーされます。また、何らかの理由で for ループを when( ステートメントに入れようとすると、構文エラーが発生しますか?

イベントをトリガーする前に、大量の Ajax リクエストを作成し、それらがすべて完了するまで待機する方法について、誰かアドバイスはありますか? または、私が現在持っているものを修正するために離れていますか?

助けてくれてありがとう。

4

2 に答える 2

23

あなたが求めていることをすることは可能です。ただし、リクエストを送信しているサーバーには、強制する制限の理由がある可能性があります。Web 開発に携わり、DDOS、スクレイピング、およびその他の API の悪用がいかに煩わしいものであるかを直接目にした者として、私はそれらの制限に従うことをお勧めします。

そうは言っても、これを行う方法は次のとおりです。

$.ajax は実際には遅延オブジェクトを返すので、それを有利に利用できます。また、 $.when は、任意の数の遅延オブジェクトを受け入れることができます。これら 2 つの事実を組み合わせることで、問題を解決できます。

var deferreds = [];
$.each(groupedStats, function(index, stat){
    deferreds.push(
        // No success handler - don't want to trigger the deferred object
        $.ajax({
            url: '/some/url',
            data: {stat: stat},
            type: 'POST'
        })
    );
});
// Can't pass a literal array, so use apply.
$.when.apply($, deferreds).then(function(){
    // Do your success stuff
}).fail(function(){
    // Probably want to catch failure
}).always(function(){
    // Or use always if you want to do the same thing
    // whether the call succeeds or fails
});

これは競合状態ではないことに注意してください。$.ajax は非同期ですが、$.each はそうではありません。そのため、遅延オブジェクトのリストは、$.when に到達する前の合計リストになり、$.then/$.fail/$.always は、すべてが完了するとトリガーされます。 .

編集: 5 秒ごとの分割を追加するのを忘れていましたが、これは一般的な考え方を示しています。おそらくここから、それを問題に適用する方法を理解できるでしょう。ちなみに、 array.splice(0,5) を使用して、配列から次の 5 つの結果を取得できます。.splice は安全に使用できます。要素の総数が 5 未満の場合は、残りのすべての要素が取得されます。

于 2013-08-25T02:25:59.527 に答える
1

Async.js ライブラリを使用できます。それぞれの機能を試してみてください。

于 2013-08-25T01:21:08.363 に答える