javascript等待几个回调完成

javascript等待几个回调完成,javascript,Javascript,我有以下javascript程序: function jQueryFunction(url, callback) { $.ajax ({ type: "GET", async: true,

我有以下javascript程序:

                function jQueryFunction(url, callback)
                { 
                    $.ajax
                            ({
                                type: "GET",
                                async: true,
                                url: url,
                                dataType: "jsonp",
                                jsonp: "callback",
                                jsonpCallback: "tpsHandler",
                                success: function(json)
                                {
                                    return callback(json);
                                }
                            });  
                }

                var jsonArray = new Array();
                for(var i = 0; i < 10; i++)
                {
                    jQueryFunction(url[i], function(json){
                       jsonArray[i] = json;
                    });
                }

                //process jsonArray
function jQueryFunction(url,回调)
{ 
$.ajax
({
键入:“获取”,
async:true,
url:url,
数据类型:“jsonp”,
jsonp:“回调”,
jsonpCallback:“tpsHandler”,
成功:函数(json)
{
返回回调(json);
}
});  
}
var jsonArray=新数组();
对于(变量i=0;i<10;i++)
{
jQueryFunction(url[i],函数(json){
jsonArray[i]=json;
});
}
//进程jsonArray
但是,当我在for循环之后检查jsonArray时,它是空的。所以我的问题是,如何在for循环中存储从jQueryFunction到jsonArray的返回值,然后对其进行处理

我尝试过$.when.apply($,jsonArray).done(函数),但仍然是一样的,它是空的。

一个简单的方法:

function doTheAjax(url, callback) { 
  return $.ajax({
    type: "GET",
    async: true,
    url: url,
    dataType: "jsonp",
    jsonp: "callback",
    jsonpCallback: "tpsHandler"
  });
};

var reqs = [];

for(var i = 0; i < 10; i++) {
  reqs.push(doTheAjax(url[i]));
}

// send the array of requests to when, which will fire `done`
// when it's, well, done
$.when.apply($.when, reqs).done(function() {
  $.each(arguments, function(data) {
    // process the data
  });
});

我不知道为什么(使用延期)的答案不起作用。但问题的原因是,在任何ajax响应到达之前检查数组。
i
在所有回调上引用相同的值时也有问题

一个简单的解决方法是,如果您知道需要多少响应:

var arr = [];
for(var i = 0; i < 10; i++){
    jQueryFunction(url[i], function(json){
        arr.push(json);
        if(arr.length == 10) {
            // All 10 responses arrived!
            // DO STUFF FROM HERE
            // e.g., call another function
            console.log(arr);
        } 
    });
}
var arr=[];
对于(变量i=0;i<10;i++){
jQueryFunction(url[i],函数(json){
arr.push(json);
如果(arr.length==10){
//10条回复都到了!
//从这里做起
//例如,调用另一个函数
控制台日志(arr);
} 
});
}

您正在传递一个数字作为URL,这可能解释了为什么它是空的?您是否检查了来自Chrome开发工具之类的工具的返回?是的,回调(json)是正确的。我只想把它们存储到一个数组中可能的副本?猜测某人不喜欢“使用延迟”回答,我认为这是行不通的。如果我在for循环后检查arr,它必须为null。你不应该在循环后检查它,请参阅代码中的注释。
var arr = [];
for(var i = 0; i < 10; i++){
    jQueryFunction(url[i], function(json){
        arr.push(json);
        if(arr.length == 10) {
            // All 10 responses arrived!
            // DO STUFF FROM HERE
            // e.g., call another function
            console.log(arr);
        } 
    });
}