2013-08-31 5 views
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'); 
}); 

결과 (콘솔) 발사? 상태에 관계없이 모든 요청이 완료 될 때 사용할 수있는 지연된 콜백이 있습니까? 그들 모든resolved을 때deferred.always()는 너무 일찍

http://jsfiddle.net/W9A3f/

+0

을()', 단지 추가'그에게') (그 때는 당신은 모든 대기 할 수있는 수단이 있어야합니다 응답. – DevlshOne

+0

@DevlshOne 두 호출이 모두 성공하면'then()'만 호출됩니다. – Johan

+0

맞습니다. 통화가 실패하더라도 OP가 결과를 원한다고 말하는 것입니까? – DevlshOne

답변

4

.when(...) 는 콜백을 트리거하거나, 즉시 그 어떤 로는 rejected이다.

두 번째 AJAX 호출이 오류가되므로은 첫 번째 AJAX 호출이 성공했는지 여부와 관계없이 두 번째 AJAX 호출 오류가 발생하는 즉시 발생합니다.

시나리오에 대한 내가 아는 유일한 해결책은 각 AJAX 요청에 대해 주위에 두 번째 $.Deferred을 유지하는 것입니다, 각 AJAX 요청의 always 처리기에서 다음 resolve 그. 그런 다음 $.when 호출 deferreds를 사용 : 당신은 이미 .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 
}); 
+0

그럼, 동기화 된 콜백을 만들 수있는 방법이 있습니까? – Johan

+0

@Johan 이미 추가했습니다. – Alnitak