2013-11-09 76 views
1

我想用$ .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()不運行。這是限制嗎?有沒有更好的方法來構建這個不使用嵌入式事件的代碼?

+0

難道你不應該把第二個'$ .when'放在第一個一個,否則,如果每次向陣列添加承諾時調用它,那麼使用'$ .when'有什麼意義? – adeneo

回答

1

這是一個更加垂直的承諾方式鏈接。由於$.getJSON本身回覆承諾,因此無需在$.when中打包第一個電話。注意,2 then's具有在序列來解決最終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之前

UPDATED DEMO(略微更真實的世界數據與嵌套數組數據輸出處理)

+0

謝謝,這最終會變得非常乾淨而且效果很好。 – ballofpopculture

+0

np ...讓我的頭解開了一些有關他們的大循環鏈 – charlietfl

相關問題