2012-04-27 4 views
0

나는 다음과 같은 매개 변수가 있습니다

a = [{param:'a'}, {param:'b'}, {param:'c'}] 

내가 같이, 각 매개 변수에 대한 GET 요청을하고 싶습니다 :

a.map(function(ai){return $.get('myapi/get?ai='+ai.param)}) 

모든 get 요청이 완료되면 어떻게해야합니까?

나는 다음과 같이 $ .when를 사용하여 시도했다 : 나는 do_something_with(a)를 호출 할 때 나는 새로운 .result 속성을 가지고 있지 않는 한

$.when(
    a.map(function(ai){return $.get('myapi/get?ai='+ai)}) 
) 
.done(function(results){ 
    results.forEach(function(ri, i){ 
     ri.success(function(result){ 
      a[i].result = result 
     } 
    } 
    do_something_with(a) 
} 

불행히도 나는 명확하게 $.when().done() 관용구를 오해하고있다. 나는 이 하나의 배열을보고 있기 때문에 get이 끝나기를 기다리는 것과는 반대로 .done()으로 똑바로 넘어갑니다.

도움이 될 것입니다.

+0

'ri.success'란 무엇입니까? 'ri'는 AJAX 호출에 의해 반환되는 결과입니다 (또는 코드의 다른 에러가 아닌 경우). 지연된 /'jqXHR' 객체가 아닙니다. – Tgr

답변

2

당신이 필요합니다

$.when.apply($, myArray); 

this === $$.when()내용을 해당 배열은 각 호출에 의해 반환 된 이연 객체를 포함하는 배열 myArray되는 인수의 나머지를 호출 Function.apply를 사용하여 $.get.


는 각 AJAX 호출의 완료에 해결 될 것입니다 연기 객체의 새로운 배열을 반환이지도 기능을 통해 연기 객체의 배열을 전달할 수, 귀하의 의견에서 두 번째 질문에 대답하려면 성공 여부에 관계없이 끝날 내가 어떤 매개 변수 (있는 경우) 모르겠어요

var alwaysDef = def.map(function(old) { 
    var def = $.Deferred(); 
    old.always(def.resolve); 
    return def; 
}); 

참고이 경우의 최종 .done 함수에 전달된다. 그 중요한 경우

는 연기 객체는 항상 당신이 나중에 사용할 수 있도록 배열에 AJAX 결과를 저장하고 원래 약속의 각각에 대한 .done 핸들러를 등록 할 수 있도록 순서로 호출하고, .fail 핸들러는 null을 저장하는있다 값 대신.

이렇게하면 각 결과가 나올 때까지 최종 .when 처리기가 호출되지 않습니다.

+0

그것은 빠름! .done()에서 응답을 처리 할 때 동일한 트릭을 사용합니까? –

+0

@MikeDewar'.done()'에서는 각 AJAX 호출에 대해 AFAICR 응답 데이터를 검색하기 위해'arguments' 의사 배열을 사용해야합니다. – Alnitak

+0

done 콜백 내에서 console.log (arguments)를 사용하여 인수가 무엇인지 확인하십시오. 객체 또는 배열의 배열이어야합니다. –