簡體   English   中英

將ajax響應分配給全局變量

[英]Assign the ajax response to a global variable

在這段代碼中,我希望來自postgresql的“用戶ID”(將是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);          
            }
    });
}

在您的其他函數參考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,此時您可以設置全局變量。 或者,理想情況下,您可以使用閉包來保護用戶ID的值,以免使用javascript控制台重置它,而不是使用全局變量。

同步:調用addUser()時只需使用“ asysc”:false屬性,以便在設置用戶id屬性之前不調用setpersonalinfo()。

嘗試以下操作:創建一個封裝用戶數據處理的閉包,然后將返回的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();
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM