0
var xhr1 = $.ajax({ url:'/echo/json/', data:{ delay: 3 } }),
    xhr2 = $.ajax({ url:'/echo/json/something/invalid', data:{ delay: 3 } });

xhr1.always(function(){
    console.log('xhr1 always');
});

xhr2.always(function(){
    console.log('xhr2 always');
});

$.when.apply($, [xhr1, xhr2]).always(function(){
    console.log('xhr1 & xhr2 always');
});

結果 (コンソール):

xhr2 always
xhr1 & xhr2 always
xhr1 always 

deferred.always()両方の ajax 呼び出しが完了するのを待たないのはなぜですか? ステータスに関係なく、すべてのリクエストが完了したときに使用できる遅延コールバックはありますか?

http://jsfiddle.net/W9A3f/

4

1 に答える 1

4

は、それらのすべてが である場合、またはそれらのいずれかが であるとすぐに、.when(...)そのコールバックをトリガーします。resolvedrejected

2番目の AJAX 呼び出しはエラーに.when().always()なるため、最初の AJAX 呼び出しがまだ成功したかどうかに関係なく、2 番目の AJAX 呼び出しエラーが発生するとすぐにエラーが発生します。

あなたのシナリオで私が知っている唯一の解決策は、AJAX リクエストごとに 1 秒を維持し$.Deferred、次にresolve各 AJAX リクエストのalwaysハンドラーでそれらを維持することです。次に、これらのdeferred を$.when呼び出しで使用します。

var def1 = $.Deferred();
xhr1.always(def1.resolve);

var def2 = $.Deferred();
xhr2.always(def2.resolve);

$.when(def1, def2).done(function() {
    // only called when the two XHRs complete, whether
    // they succeeded or not
});
于 2013-08-31T21:15:06.667 に答える