2013-11-09 7 views
1

저는 2 $ .when.apply()의 $ .ajax 및 $ .getJSON과 함께 사용하려고합니다. 하나를 다른 안에 포함하려고 시도하고 있지만 작동하지 않는 것 같습니다. 여기에 윤곽이 있습니다 :jQuery에서 when.applys()를 내장 할 수 있습니까?

var jxhr = []; 
var kxhr = []; 

$.when($.getJSON('stuff.js', function(cart){ 
    //Grab Stuff 
})).then(function(){ 
     for(i<stuff) 
     { 
      jxhr.push($.getJSON(array[stuff]) 
     } 

     $.when.apply($, jxhr).done(function() 
     { 
      for(i<array2) 
      { 
       kxhr.push($.getJSON(array2[morestuff])) 

      } 
      $.when.apply($, kxhr).done(function()) 
      { 
       //Finish up here. 
       //Not running. 
      } 
     }); 
} 

일부 구문 오류가 코드를 끌어 오지만 구조가 있어야합니다. 문제는 두 번째 $ .when.apply()가 실행되지 않는다는 것입니다. 이것은 제한 사항입니까? 내장 된 when을 사용하지 않는이 코드를 구조화하는 더 좋은 방법이 있습니까?

+0

두 번째'$ .when'을 첫 번째 칸의 바깥에 두지 않아야합니까? 하나, 그렇지 않으면 당신이 배열에 약속을 추가 할 때마다 그것을 호출하면'$ .when'을 사용하는 것이 무엇입니까? – adeneo

답변

1

다음은 약속 방식의 수직 연쇄입니다. $.getJSON 자체가 약속을 되 돌리므로 $.when에 첫 번째 전화를 감쌀 필요가 없습니다. 최종 done

$.getJSON(url, function(cart) { 
    $('body').append('<p>First getJSON call made</p>'); 
}).then(function(){ 
    var jxhr = []; 
    $('body').append('<p>Start first loop then</p>') 
    for (var i = 0; i < 5; i++) { 
    jxhr.push(getSomeData('Loop 1')) 
    }  
    return $.when.apply($, jxhr) 
}).then(function(){ 
    var kxhr = []; 
    $('body').append('<p>Start second loop then</p>') 
    for (var i = 0; i < 5; i++) { 
     kxhr.push(getSomeData('Loop2')) 
    } 
    return $.when.apply(null, kxhr) 
}).done(function(){ 
    $('body').append('<p>DONE!</p>'); 

}); 


function getSomeData(loop) { 
    return $.getJSON(url, function(res) { 
     $('body').append('<p>'+loop+' getJSON call made</p>'); 
    }) 
} 

DEMO이라고 전에 2 then's 순차적으로 해결하는 데 유의

UPDATED DEMO (중첩 어레이 데이터 출력과 약간 더 실제 데이터 처리)

+0

고마워요, 이젠 너무 깔끔 해지고 멋지 네요. – ballofpopculture

+0

np ... 내 머리가 큰 루프가있는 체인에 대해 조금 풀 었어. – charlietfl