这个问题应该有一些合理的解释,但我找不到任何东西。我在我的javascrtipt应用程序中使用OOP,并且我正在尝试将变量值设置为函数。
首先,值init_s.__temp_var
等于空对象。在我调用函数logic_s.get_active_statuses(..)
之后,它应该被覆盖。但事实并非如此。动作:
var widget = {
settings: {
__temp_var: {}
},
init: function () {
init_s = this.settings;
logic_s = this.functions_available;
},
functions_available: {
get_active_statuses: function (id) {
jQuery.ajax({
url: .....,
type: 'POST',
dataType: 'JSON',
data: {
....
},
success: function (data) {
init_s.__temp_var = data; // not working
return data; // undefined
},
error: function (e) {
console.log(e.message);
}
});
}
},
my_actions: {
logic: function () {
var active_services_status = logic_s.get_active_statuses(5);
console.log(init_s.__temp_var); // should print {id : 5}
console.log(active_services_status ); // if used with return prints "undefined"
}
}
};
因此,当我第一次调用logic_s.get_active_statuses(5);
时,它会将空对象记录下来,但是当我第二次调用它时,它会记录我{id : 5}
。如果第三个时间变量为10,它将在第4次调用后立即打印。为什么会这样?似乎变量在打印后被设置了..
修改
它的工作方式并返回“未定义”:
function get_active_status (id) {
jQuery.ajax({
url: .....,
type: 'POST',
dataType: 'JSON',
data: {
....
},
success: function (data) {
return data; // undefined
},
error: function (e) {
console.log(e.message);
}
});
};
get_active_status(5); // returns "undefined" instead of object that was sended
答案 0 :(得分:1)
当您使用AJAX时,您的请求为asynchronous。这意味着它在这里发送了一些请求
logic_s.get_active_statuses(5)
并且不等待响应(成功仅在您收到服务器的响应后执行)并继续执行
console.log(init_s.__temp_var); // should print {id : 5}
console.log(active_services_status ); // if used with return prints "undefined"
您可以使用setTimeout(),但这会破坏异步行为的任何功能。 另一种方法 - 查找选项 async ,默认情况下为true。你的职能是:
function get_active_status (id) {
jQuery.ajax({
url: .....,
type: 'POST',
dataType: 'JSON',
async: false,
data: {
....
},
success: function (data) {
return data; // undefined
},
error: function (e) {
console.log(e.message);
}
});
};