次のような入れ子になった一連の 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()
が、私が見つけたサンプルはすべて、最初の反復後にトリガーする必要があるように見えました...
(関数は意図的に分離されています。これは、一方のみを使用する理由や他方のみを使用する理由がある場合があるためです)。
前もって感謝します!