我觉得这很容易,但我无法弄清楚。
我想在getCurrentUser函数中设置currentUserId,我希望能够在其他函数中调用它。
以下是我现在拥有的内容,它返回undefined。我错过了什么?
var currentUserId;
function getCurrentUser() {
$.ajax({
type: "GET",
url: '/set_user',
success: function(result) {
currentUserId = result.id;
return currentUserId;
},
error: function(err) {
console.log(err);
}
})
};
getCurrentUser();
console.log("current user id is " + currentUserId);
答案 0 :(得分:2)
发生这种情况是因为在getCurrentUser
方法内部,您正在进行异步AJAX调用,因此当您使用console.log
进行打印时,该值尚未就绪。
当GET /set_user
请求成功结束时,将正确设置该值,仅在这种情况下函数:
success: function(result) {
currentUserId = result.id;
return currentUserId;
}
将被执行,currentUserId
将被设置。
根据jQuery.ajax()文档,$.ajax
调用返回的值是Promise。首先,将promise返回给调用者(1),然后等待promise被解析为打印值(2)。
var currentUserId;
function getCurrentUser() {
return $.ajax({ // 1. Return the Promise here
type: "GET",
url: '/set_user',
success: function(result) {
currentUserId = result.id;
return currentUserId;
},
error: function(err) {
console.log(err);
}
})
};
// 2. Then wait the call to succeed before print the value (use the 'done' method)
getCurrentUser().done(function() {
console.log("current user id is " + currentUserId);
});
答案 1 :(得分:2)
就像Andrea解释的那样,当你进行ajax调用时,这个值还没准备好。
避免这种情况的一种方法是使用回调:
function getCurrentUser(callback) {
$.ajax({
type: "GET",
url: '/set_user',
success: function(result) {
var currentUserId = result.id;
if (callback)
callback(currentUserId);
},
error: function(err) {
console.log(err);
}
})
};
function displayResult(userId){
console.log("current user id is " + userId);
}
getCurrentUser(displayResult);

这也将避免使用globe变量currentUserId。