2014-09-21 60 views
0

在这段代码中,我希望将来自postgresql的“userid”(将作为ajax或变量“res”的“响应”)存储到全局变量“id”中所以我可以将它用于未来的使用。将ajax响应分配给一个全局变量

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无法识别。我该怎么做呢?

+0

你这样做是错误的,不要试图使它同步,因为你不知道如何使用异步代码,学习如何正确地做到这一点。 – adeneo 2014-09-21 16:49:34

+0

我试着做它异步它(它是默认的),但它不工作。那么如何使用@adeneo? – anobilisgorse 2014-09-21 16:51:53

+0

它可能工作得很好,但你不能使用成功回调以外的数据,全局或不是,这就是异步的意思。 – adeneo 2014-09-21 16:53:03

回答

0

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

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

同步:调用addUser()时只需使用“asysc”:false属性,以便setpersonalinfo()在设置了用户标识属性之前不会被调用。

+0

如果我选择同步,我只是把“async:false”的权利?但是,当我打电话给setpersonalinfo()时,ID仍然没有设置? – anobilisgorse 2014-09-21 17:20:13

+0

是的,只需设置$ .ajax({...,'async ':false})选择同步,我不知道为什么id值没有在你的情况下设置,我需要看到更多的代码才能够回答。 ajax,我可以在被其他函数使用之前设置非局部变量值,如预期的那样。 – Edgar 2014-09-21 21:29:21

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."); 
       } 
    }); 
} 

对不起格式化。

+0

没有抱歉,它不起作用。 :( – anobilisgorse 2014-09-22 05:08:15

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(); 
}); 
相关问题