6

遅延オブジェクトのコールバックの前に実行する各 ajax リクエストで、done/fail/always コールバックを取得できません。

私が抱えている問題は、私の ajax リクエストの一部が失敗する可能性があることですが、失敗するかどうかにかかわらず、同じコードを実行する必要があります。

正確に説明するのは難しいので、私が抱えている問題を示すためにこのフィドルを作成しました。 http://jsfiddle.net/zZsxV/

var a1 = $.Deferred();
var a2 = $.Deferred();
var a3 = $.Deferred();

a1.done(function() {
    $('body').append('a1 done<br />');     
}).fail(function() {
    $('body').append('a1 fail<br />');     
}).always(function() {
    $('body').append('a1 always<br />');     
});

a2.done(function() {
    $('body').append('a2 done<br />');     
}).fail(function() {
    $('body').append('a2 fail<br />');     
}).always(function() {
    $('body').append('a2 always<br />');     
});

a3.done(function() {
    $('body').append('a3 done<br />');     
}).fail(function() {
    $('body').append('a3 fail<br />');     
}).always(function() {
    $('body').append('a3 always<br />');     
});

var def = $.when(a1, a2, a3);
def.always(function() {
    $('body').append('defer always <-- should be after all<br />'); 
});

setTimeout(function() {
    a1.resolve();
}, 5000);
setTimeout(function() {
    a2.reject();
}, 1000);
setTimeout(function() {
    a3.resolve();
}, 3000);

このトピックに関する多くの回答を読みましたが、私のニーズに正確に適合するものはないと思います。

役立つ情報がさらに必要な場合はお知らせください。戻ってきたら追加します。前もって感謝します。


編集

私は何が起こっているのか理解しています。この問題を回避する方法を知っているだけです。.then も同じ結果で使用してみました。1 つの要求が拒否されると、他のコールバックを待機する前に失敗コールバックを起動します。

4

3 に答える 3

2

jQueryのドキュメント によると、すべてのパラメータが解決されるか、そのうちの1$.whenつが拒​​否されると、コールバックが発生します。では、代わりにそのようなものを使用するのはどうですか:$.when

var custom_when = function() {
    var args = $.makeArray(arguments);
    var callback = args.pop();
    var all = [];
    $.each(args, function(index, def) {
        def.always(function() {
            var idx = all.indexOf(def);
            if (idx !== -1) {
                all.splice(idx, 1);
            }
            if (!all.length) {
                callback();
            }
        });
        all.push(def);
    });
};

次のように使用できます。

custom_when(a1, a2, a3, function() {
    // do some stuff.
});

およびjsFiddle デモ

于 2013-05-27T21:09:09.320 に答える