将ajax响应分配给全局变量

时间:2014-09-21 16:45:24

标签: 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").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。我该怎么做呢?

3 个答案:

答案 0 :(得分:1)

创建具有属性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);          
            }
    });
}

并在您的其他函数中引用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.");
              }
    });
}

抱歉格式化。

答案 1 :(得分:0)

异步:在addUser()的ajax成功函数中,调用setpersonalinfo(),确保window.id已经设置好并可以使用。

Single-ajax:更好的方法是简单地调用setpersonalinfo()并让服务器确定用户是否已经存在,或者如果没有提交id值,则假设必须首先创建新用户。正确的输入验证无论如何都必须检测重复的用户凭证,因此这不是不必要的工作。然后setpersonalinfo()将返回一个用户ID,您可以在那时设置全局变量。或者理想情况下,不使用全局变量,而是使用闭包来保护用户id的值不被javascript控制台重置。

Synchronous:在调用addUser()时只需使用" asysc":false属性,这样在设置用户id属性之前不会调用setpersonalinfo()。

答案 2 :(得分:0)

尝试这样做:创建一个封装用户数据处理的闭包,然后在返回的闭包内使返回的id成为变量。在你的js中使用以下模式也是一个好主意(称为'模块')。

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