我有以下javascript代码:
function requestUserList(){
//El primer paso es obtener de PHP toda la información de los usuarios
var ret;
jQuery.ajax({
type: "POST",
url: 'userfunctions.php',
dataType: 'json',
data: {functionname: 'all_user_data'},
success: function (obj) {
// if (obj.error == ""){
// for (i = 0; i < obj.users.length; i++){
// addAUser(obj.users[i],i);
// }
// }
// else{
// postErrorMessage(obj.error);
// }
console.log("Number is " + obj.users.length);
ret = obj;
}
});
console.log("Going back. N is " + ret.users.length);
return ret;
}
问题是消息&#34;号码是&#34;在控制台中以正确的值打印。但是在第二个控制台上打印(&#34;回去.N是&#34;)我得到的错误是用户不是未定义的属性。我不确定地错误地分配了返回值,但我不知道为什么。谁能帮我?我希望obj成为函数的返回。
答案 0 :(得分:0)
您的功能是异步的,因此您无法以这种方式返回所需的值,您可以使用回调或承诺,这是您的情况的回调示例:
function requestUserList(callback){
jQuery.ajax({
type: "POST",
url: 'userfunctions.php',
dataType: 'json',
data: {functionname: 'all_user_data'},
success: function (obj) {
callback(obj);
}
});
}
requestUserList(function (obj) {
console.log(obj);
});
答案 1 :(得分:0)
您有一个可变范围错误。 var ret;
仅为函数范围定义ret。然后使用新范围声明一个新函数,该范围隐式声明第二次ret。
这样第一次撤退与第二次撤退完全无关。你需要在成功函数中调用ret所需的任何东西。现在返回不会将值返回给你的函数,而是返回jQuery.ajax调用 - 并且在调用之后它会消失。
另外AJAX是异步的。这意味着你不知道什么时候会完成 - 因此,你不能从那里返回值。至少以明智的方式。
getSomething = function () {
$.ajax({
url: url,
data: "",
type: 'GET',
success: doSuccessStuff,
error: doErrorStuff,
});
};
doSuccessStuff = function (data) {
// Have your stuff in data like data.myVariable
};
您可以将AJAX切换为同步 - 然后从成功函数中获取值,如下所示:
getSomething = function () {
$.ajax({
url: url,
data: "",
type: 'GET',
success: doSuccessStuff,
error: doErrorStuff,
async: false
});
};
doSuccessStuff = function (data) {
// Have your stuff in data like data.myVariable
};
然而,这是一种不好的做法,因为它会停止你的程序流程,直到它超时或得到回复。最好坚持在成功调用中正向执行链接函数。