Javascript 将ajax响应分配给全局变量
在这段代码中,我希望postgresql中的“userid”,即ajax或变量“res”的“响应”,存储在全局变量“id”中,以便将来使用Javascript 将ajax响应分配给全局变量,javascript,jquery,ajax,postgresql,response,Javascript,Jquery,Ajax,Postgresql,Response,在这段代码中,我希望postgresql中的“userid”,即ajax或变量“res”的“响应”,存储在全局变量“id”中,以便将来使用 var id; function addUser() { $.ajax({ url: siteloc + scriptloc + "adduser.py", data: {username:$("#login").val(), password:$("#password").val(), email:$("#email").va
var id;
function addUser()
{
$.ajax({
url: siteloc + scriptloc + "adduser.py",
data: {username:$("#login").val(), password:$("#password").val(), email:$("#email").val()},
dataType: 'json',
success: function (res) {
window.id = res;
console.log(id);
}
});
}
这一切在console.log(id)中进行得很顺利,它在控制台中显示了id。但当我进入下一个功能时
function setpersonalinfo()
{
$.ajax({
url: siteloc + scriptloc + "setpersonalinfo.py",
data: {userID:id,
fullname:$("#fullname").val(),
birthday:$("#birthday").val(),
gender:$("#gender").val() },
dataType: 'json',
success: function (res) {
console.log("Successfully added.");
}
});
}
无法识别“userID:id”中的id。我该怎么做 正在创建属性id为的对象,如下所示
var data = new Object({id: ""});
然后将data.id设置为输出
function addUser()
{
$.ajax({
url: siteloc + scriptloc + "adduser.py",
data: {username:$("#login").val(), password:$("#password").val(), email:$("#email").val()},
dataType: 'json',
success: function (res) {
data.id = res;
console.log(data.id);
}
});
}
在其他函数reference data.id中
function setpersonalinfo()
{
$.ajax({
url: siteloc + scriptloc + "setpersonalinfo.py",
data: {userID:data.id,
fullname:$("#fullname").val(),
birthday:$("#birthday").val(),
gender:$("#gender").val() },
dataType: 'json',
success: function (res) {
console.log("Successfully added.");
}
});
}
抱歉格式化。异步:在addUser()的ajax成功函数中,调用setpersonalinfo(),确保window.id已设置并准备好使用 单一ajax:更好的方法是调用setpersonalinfo(),让服务器确定用户是否已经存在,或者如果没有提交id值,则假定必须首先创建一个新用户。正确的输入验证必须检测重复的用户凭证,所以这不是不必要的工作。然后,setpersonalinfo()将返回一个用户id,此时您可以设置全局变量。或者,理想情况下,不使用globals,而是使用closure来保护用户id的值不被javascript控制台重置
同步:在调用addUser()时只需使用“asysc”:false属性,以便在设置用户id属性之前不会调用setpersonalinfo()。尝试以下操作:创建一个封装用户数据处理的闭包,然后将返回的id设为闭包中的变量。在js中使用以下模式(称为“模块”)也是一个好主意
你做错了,不要因为不知道如何使用异步代码而尝试使其同步,而是要学习如何正确地使用它。我尝试过异步(默认情况下是异步的),但它不工作。那么@adeneo是如何工作的呢?它可能工作得很好,但是你不能在成功回调之外使用数据,不管是否是全局的,这就是异步的意思。是的,但这就是我的目标,我需要在函数之外使用响应。怎么用?还有其他的解决方法吗?如果我选择Synchronous,我只会说“async:false”对吗?但是为什么在我调用setpersonalinfo()时仍然没有设置id?是的,只需设置$.ajax({…,'async':false})来选择同步。我不知道为什么在您的情况下没有设置id值,我需要查看更多代码才能回答。在我使用同步ajax的极少数实例中,我能够像预期的那样,在被其他函数使用之前设置非局部变量值。
function Users() {
//Global vars
var newUserId;
var methods = {
add: function(callback) {
$.ajax({
url: siteloc + scriptloc + "adduser.py",
data: { username: $("#login").val(), password: $("#password").val(), email: $("#email").val() },
dataType: 'json',
success: function (res) {
newUserId = res;
console.log(newUserId);
if (typeof(callback) == "function") {
callback();
}
}
});
},
updatePersonalInfo: function () {
$.ajax({
url: siteloc + scriptloc + "setpersonalinfo.py",
data: {
userID: newUserId,
fullname: $("#fullname").val(),
birthday: $("#birthday").val(),
gender: $("#gender").val()
},
dataType: 'json',
success: function (res) {
console.log("Successfully added.");
}
});
}
};
return methods;
}
//Usage example. add() could also pass the new user's id to the callback as a parameter, so
//you wouldn't have to store it at all.
var users = new Users();
users.add(function () {
users.updatePersonalInfo();
});