我在循环中发出多个AJAX请求。这是我的代码:
// set defaults
var app_id = 'xxx';
var secret = 'yyy';
var auth_token = 'zzz';
// list of items to call in the API
var insights_to_check = ['application_permission_views_top_unique', 'application_installation_adds_unique', 'application_installation_removes_unique'];
var json_responses = {};
var ajax_calls = [];
// construct the API url
for (var i in insights_to_check) {
var insight = insights_to_check[i];
var url = 'https://graph.facebook.com/' + app_id + '/insights/' + insight + '?' + auth_token;
ajax_calls.push(get_json(url, insight));
}
// when all ajax requests are done, call the process function
$.when.apply($, ajax_calls).done(function(){
process_json(json_responses);
});
// collect responses to the ajax request in a global object
function get_json(url, insight) {
$.getJSON(url, function(json) {
json_responses[insight] = json;
});
}
// show the global object
function process_json(all_json) {
console.log(all_json);
}
代码有一个奇怪的问题:第一次运行时,我可以看到AJAX请求触发并返回,但是当process_json()
被调用时,它会记录undefined
。如果我第二次手动调用它,它会按预期返回json。
似乎我的延迟回调是在AJAX请求完成之前触发的,或者至少是。在他们能够将响应分配给全局json_responses
对象之前。谁能在这里看到任何明显的东西?
答案 0 :(得分:2)
我不确定为什么它会记录undefined
(如果我省略Ajax调用it does not for me),但代码的一个问题是.done()
回调立即执行 ,因为ajax_calls
是一个空数组。
您必须从$.getJSON
返回get_json
的返回值:
function get_json(url, insight) {
return $.getJSON(url, function(json) {
json_responses[insight] = json;
});
}
这可能会解决问题。