我尝试填充全局变量selectedDates
以及第一个函数,但是当我尝试获取某些值时失败,例如,selectedDates['1/23/2013']
尝试使用$ .ajax而不是$ .get后,我可以获得selectedDates['1/23/2013']
之类的值。
如果它们都填充了返回到设置the_selected_dates
的外部变量selectedDates
,那么区别在哪里?
var selectedDates = {};
使用$.get
的功能失败:
function getSelectedDates_fails(lead_id, month) {
var the_selected_dates = {};
$.get(
window.location.href,
{
gf_lm_ajax : 1,
get : 'lead_reminder_get_dates',
lead_id : lead_id,
month : month,
nonce_gf_lm_ajax : gf_lmJsVars.nonce_gf_lm_ajax
},
function(output) {
$.each(output.reminders, function(n, val) {
the_selected_dates[val.date] = val.date;
});
}, 'json');
return the_selected_dates;
}
selectedDates = getSelectedDates_fails(35, 12); console.debug(selectedDates);
调试数据
使用$.ajax
的功能有效:
function getSelectedDates_works(lead_id, month) {
var the_selected_dates = {};
$.ajax(
{
url : window.location.href,
dataType : 'json',
data : {
gf_lm_ajax : 1,
get : 'lead_reminder_get_dates',
lead_id : lead_id,
month : month,
nonce_gf_lm_ajax : gf_lmJsVars.nonce_gf_lm_ajax
},
async : false,
success : function(output)
{
$.each(output.reminders, function(n, val) {
the_selected_dates[val.date] = val.date;
});
}
});
return the_selected_dates;
}
selectedDates = getSelectedDates_works(35, 12); console.debug(selectedDates);
调试数据
答案 0 :(得分:4)
当您同步运行$.ajax
时,$.get
不是。
这就是为什么getSelectedDates_fails()
返回的速度比从服务器获得响应的速度快,因此返回一个空对象{}
。
您在selectedDates
中看到的是在请求完成之前对象的状态异步。
您可以使用$.ajaxSetup()
全局更改所有$.ajax
个来电的行为。但是,我不建议将async
设置为false
。
答案 1 :(得分:2)
aysnc: false
中有$.ajax
,这是您无法直接使用$.get
打开的设置 - 您必须使用$.ajaxSetup
。但是,它可能不是您想要做的事情,但如果ajax请求异步运行,则在ajax请求完成之前已达到return the_selected_dates;
。相反,您必须在回调中进行调试。
答案 2 :(得分:2)
设置async: false
时,成功处理程序将在main函数返回之前先运行;这就是为什么它有效。但是,这是不推荐,因为它在执行调用时会挂起您的浏览器。
您应该以异步方式执行此操作,方法是将回调函数传递到处理结果时调用的getSelectedDates_works()
函数中。这样,浏览器就会在请求和响应之间“休息”。
function getSelectedDates_works(lead_id, month, cb)
{
$.ajax({
// ...
success: function(output) {
var the_selected_dates = [];
$.each(output.reminders, function(n, val) {
the_selected_dates[val.date] = val.date;
});
// perform callback
cb(the_selected_dates);
}
});
}
getSelectedDates_works(123, 456, function(dates) {
// do stuff with dates here
});
答案 3 :(得分:2)
您应该异步获取数据,并确保在您决定对返回的数据执行某些操作时完成ajax功能:
function getSelectedDates(lead_id, month) {
return $.ajax({
url: window.location.href,
dataType: 'json',
data: {
gf_lm_ajax: 1,
get: 'lead_reminder_get_dates',
lead_id: lead_id,
month: month,
nonce_gf_lm_ajax: gf_lmJsVars.nonce_gf_lm_ajax
}
});
}
getSelectedDates(35, 12).done(function(output) {
var the_selected_dates = {};
$.each(output.reminders, function(n, val) {
the_selected_dates[val.date] = val.date;
});
console.log(selectedDates);
});