3

一連の (1-20) ajax 呼び出しを行う必要があり、それらがすべて完了したら別の関数を呼び出す必要があります。完全とは、 $.ajax({ complete: ...}) が呼び出されたときを意味します。

Ivは$.whenの使用を検討しましたが、jsfiddleでそれをいじった後、2つの問題があります。1. $.then と $.done は、すべての完全なコールバックの前に呼び出されます。2. 1 つの ajax 呼び出しが失敗した場合、まったく呼び出されません。基本的に、 $.done は成功時に呼び出され、完了していないようです。

私は、この種のものを処理できる優れた ajax マネージャー/キューがそこにあるに違いないと考えています。または、一般的な非同期タスクを処理するものでさえ.. ;)

フィドル: http://jsfiddle.net/zvSgX/2

4

3 に答える 3

2

呼び出しが遅延オブジェクトを解決するときのデフォルトの jQuery の選択が気に入らない場合は$.ajax 、独自のラッパーを作成できます。

var my_ajax = function (options) {

    var deferred = $.Deferred();
    var user_complete = options.complete;

    options.complete = function (jqXHR, textStatus) {
        if (user_complete) user_complete(jqXHR, textStatus);
        deferred.resolve();
    };

    $.ajax(options);

    return deferred.promise();
};

これは、サンプルコードで実際に動作 する JSFiddleのフォークです。

は を呼び出さないため、 へ のすべての引数が呼び出しである場合、 aをにチェーンしても意味がmy_ajaxありません。deferred.reject().fail$.when$.whenmy_ajax

それが役に立てば幸いです!何か明確にできることがあれば教えてください。

于 2012-06-15T07:18:37.520 に答える
1

この問題を解決するためにpromiseパターンを使用できますこのタイプの問題を解決するためにwhen.jsライブラリを使用できますチュートリアルとサンプルは以下の場所で入手できます

https://github.com/cujojs/when

于 2012-06-14T10:39:58.937 に答える
0

私が最近使用したソリューションは、悪くはありませんでした。forループを経て、正しいデータでajax呼び出しを実行する関数でwindow.setTimeoutを実行するメソッドを呼び出しました。max 変数と counter 変数を使用して、すべての ajax 呼び出しが正しく実行されたかどうかを確認しました (成功関数の最後でカウンターをインクリメントします)。別の setTimeout によって呼び出された関数が、カウンターが max に等しいかどうかをチェックしました。そうでない場合は、新しい setTimeout でメソッドを再度呼び出します。そうでない場合は、最後に実行する必要がある関数を呼び出します。

コードでは:

var count = 0, max = 0;

function batchCall() {
var a = [{
    method: "DoThis",
    params: { param1: 1, param2: 2 }
}, {
    method: "DoThat",
    params: { param1: 3 }
}]

max = a.length;

for (var i = 0; i < max; i++) {
    callAjax(a[i]);
}

window.setTimeout(checkAllFinished, 100);
}

function callAjax(o) {
    window.setTimeout(function() {
        // do ajax call here 
    }, 0);
}

function checkAllFinished() {
    if (count == max) {
        // do what you need to do when all are called
    }
    else {
        window.setTimeout(checkAllFinished, 100);
    }
}
于 2012-06-14T10:28:23.490 に答える