10

2 つの ajax 呼び出しが完了した後にコールバックを行う方法を探しています。

$.when(
    call1(),
    call2()
).always(function() {
    // Here I want to be sure the two calls are done and to get their responses 
);

問題は、呼び出しの 1 つが失敗する可能性があることです。したがって、私のコードでは、常に他の呼び出しを待たずに呼び出されます。

両方の呼び出しが完了するのを待つにはどうすればよいですか (成功または失敗)?

4

4 に答える 4

12

トリックを行う必要があるものを次に示します。

$.whenAllDone = function() {
    var deferreds = [];
    var result = $.Deferred();

    $.each(arguments, function(i, current) {
        var currentDeferred = $.Deferred();
        current.then(function() {
            currentDeferred.resolve(false, arguments);
        }, function() {
            currentDeferred.resolve(true, arguments);
        });
        deferreds.push(currentDeferred);
    });

    $.when.apply($, deferreds).then(function() {
        var failures = [];
        var successes = [];

        $.each(arguments, function(i, args) {
            // If we resolved with `true` as the first parameter
            // we have a failure, a success otherwise
            var target = args[0] ? failures : successes;
            var data = args[1];
            // Push either all arguments or the only one
            target.push(data.length === 1 ? data[0] : args);
        });

        if(failures.length) {
            return result.reject.apply(result, failures);
        }

        return result.resolve.apply(result, successes);
    });

    return result;
}

この Fiddleをチェックして、それがどのように機能するかを確認してください。

基本的に、失敗したかどうかに関係なく、すべての Deferred が終了するのを待ち、すべての結果を収集します。失敗した場合、返された Deferred はすべての失敗のリストで失敗し、それ以外の場合はすべての成功で解決されます。

于 2013-02-26T16:29:29.430 に答える
1

きれいではありませんが、完了時に設定する ajax 呼び出しごとにグローバルな「完了」変数を設定できます。各呼び出しは、両方の変数が設定されているかどうかもチェックし、設定されている場合は、always 関数を呼び出します。

于 2013-02-26T15:39:44.720 に答える