我有以下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
但是,当我在for循环后检查jsonArray时,它为null。所以我的问题是如何将返回值从jQueryFunction存储到for循环中的jsonArray然后处理它?</ p>
我试过$ .when.apply($,jsonArray).done(函数)但仍然相同,它是null。
答案 0 :(得分:1)
一种简单的方法:
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
});
});
或者,制作一堆请求并将它们放入jsonArray
,但请保留
追踪你制作了多少。当它们全部完成时,你有阵列。创建你的
延迟拥有,在计数器启动时自行解决,并返回承诺。
var getJSON = function(url) {
var dfd = $.Deferred();
var count = 0;
var total = 10;
var jsonArray = [];
for(var i = 0; i < total; i++) {
doTheAjax(url[i]).done(function(json) {
jsonArray.push(json);
count++;
if ( count >= total ) {
dfd.resolve(jsonArray);
}
});
}
return dfd.promise();
};
getJSON().done(function(theCreatedJsonArray) {
// do stuff
});
答案 1 :(得分:0)
我不确定为什么your previous question(使用延迟)的答案不起作用。但问题的原因是你在任何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);
}
});
}