0

我的班级看起来像

function classUser() {
   var userName;
   var firstName;
   var lastName;
   var sessionid;
}

classUser.prototype.set_user_name = function (user_name) {
    this.userName = user_name;
}

classUser.prototype.set_first_name = function (first_name) {
    this.firstName = first_name;
}

classUser.prototype.set_last_name = function (last_name) {
 this.lastName = last_name;
}

classUser.prototype.get_curr_session = function () {
    return this.sessionid;
}

classUser.prototype.save = function () {

     $.ajax({
       type: "POST",
       url: "http://myapihost.com:8080/api/1.0/user/",
       data: JSON.stringify(this),
       dataType: "json",
       success: function (apiResponse) {
          var currSessionID = apiResponse.sessionId;
          this.sessionid= currSessionID;
        },
        error: function (apiResponse) {
          alert("error  : " + apiResponse);
          this.sessionid= "Error";
        }
    });
}

我称它们为

    var User = new classUser();
    User.set_first_name(userFirstName);
    User.set_last_name(response.last_name);
    User.set_user_name(response.username);

    User.save();
    var currSessionID = User.get_curr_session();

有时,get_curr_session 在成功之前被调用:调用。

问题:我尝试从成功本身返回 sessionid,以便 save() 函数完成这项工作。那是行不通的。因此我分为 2 个功能。

我可以在一个电话中完成吗?如果我使用了 2 个功能 - 我如何确保它一直有效。

我实际上可以成功分配 currSessionID,但这会破坏班级的神圣性。我见过其他解决方案,例如使用“完成”,不确定这是否会有所帮助。

========================================

我修改了代码如下

classUser.prototype.save = 函数(回调){

 $.ajax({
    type: "POST",
    url: "http://myapihost.com:8080/api/1.0/user/",
    data: JSON.stringify(this),
    dataType: "json",
    success: function (apiResponse) {
        var currSessionID = apiResponse.sessionId;
        this.sessionid= currSessionID;
        callback(null, currSessionID);
    },
    error: function (apiResponse) {
        alert("error  : " + apiResponse);
        this.sessionid= "Error";
        callback("error", null);
    }
});
}

当我打电话

User.save(mycallback);


function mycallback(error, sessId){
    if(error) {
        console.log("Some error occurred. Check code");
        return;// Something went wrong
    } else {
        console.log("Session : " + sessId);
    }
}

现在这样好吗?

谢谢阿杰

4

3 回答 3

3

那是因为ajax请求的成功和错误函数是异步执行的。

为确保不会发生这种情况,您应该在成功或错误函数运行后调用的保存函数中添加回调。

classUser.prototype.save = function (callback) {

     $.ajax({
       type: "POST",
       url: "http://myapihost.com:8080/api/1.0/user/",
       data: JSON.stringify(this),
       dataType: "json",
       success: function (apiResponse) {
          var currSessionID = apiResponse.sessionId;
          this.sessionid= currSessionID;
          callback(null, currSessionID);
        },
        error: function (apiResponse) {
          alert("error  : " + apiResponse);
          this.sessionid= "Error";
          callback(apiResponse, null);
        }
    });
}

然后,在调用保存函数时,您可以执行以下操作:

User.save(function(error, sessId) {
    if(error) {
        // Something went wrong
    } else {
        // Do whatever you need to do
    }
});

您应该注意,这也将异步运行。因此,如果您想使用会话 ID,请不要在 User.save(...) 调用之后执行此操作,而是在函数内部执行此操作。

于 2013-10-02T08:07:45.303 回答
0

$.ajax()对选项对象中指定的 url 发出异步调用。请参阅http://api.jquery.com/jQuery.ajax/上的 jQuery 文档

success是一个回调函数,在调用完成并且浏览器读取所有响应流时调用,因此基本上在大多数情况下,回调(更新会话 ID)将在您尝试检索它后执行。

于 2013-10-02T08:07:31.553 回答
0

我认为这里发生的事情是默认的 ajax 调用是异步的,这意味着代码var currSessionID = User.get_curr_session();可以在success调用完成之前执行。

您有几个选择,您可以尝试使用回调或其他方法更新您的代码以使其更具异步能力,或者指定您希望您的 ajax 调用是同步的。

于 2013-10-02T08:08:38.330 回答