Javascript 将ajax响应分配给全局变量

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

在这段代码中,我希望postgresql中的“userid”,即ajax或变量“res”的“响应”,存储在全局变量“id”中,以便将来使用

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();
});