我有一組嵌套的AJAX調用,類似的:從循環嵌套的AJAX返回數據查詢
function getSubcategories(cat,callback) {
$.ajax({
url:'myurl.php',
data:'q='+cat,
dataType='json',
success:function(result){ callback(result) }
});
}
function getSubcatElements(subcat,callback) {
$.ajax({
url:'myurl2.php',
data:'q='+subcat,
dataType='json',
success:function(result){ callback(result) }
});
}
function organizeData(cat,callback) {
getSubcategories(cat,function(res){
totals=0;
list=new Array;
$.each(res['subcat'],function(key,val){
getSubcatElements(val,function(items){
$.each(items['collection'],function(key2,val2) {
list.push(val2['descriptor']);
});
totals+=items['count'];
// If I shove "totals" and "list" into an object here to callback, obviously gets called many times
}
// If I return an object here, it doesn't actually have counts from the asynchronous call above
}
function doStuff(cat) {
organizeData(cat,function() {
//stuff
});
所以我運行一個環形異步查詢是另一個非同步查詢的孩子,我想要的兒童循環的最終結果不是「懶惰」。現在我只是返回更新後的結果,所以數字會發生幾次變化,但我想要一舉完成。
看來,明顯的做法是將結果存儲在異步中,並在$.each()
之後返回,但JavaScript是瘋狂的並嘲笑諸如顯而易見的事情。我覺得這應該涉及$.Deferred()
,但我發現所有的樣本似乎都應該在第一次迭代後觸發...
(這些函數是故意分開的,因爲有時候有理由只使用一個或只使用另一個)。
提前致謝!
更正了您的代碼,而不是回答。 data:'q = cat',應該是data:'q ='+ cat和data:'q = subcat',應該是data:'q ='+ subcat,因爲你傳遞的是函數的值。 –
嗯,你說的對,在真實的代碼中是正確的 - 我在簡化它時錯誤地轉錄了它。 (它也有更多的論據,等等) –