javascript和函数执行顺序

时间:2013-10-02 07:59:36

标签: javascript function

我的班级看起来像

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:call。

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

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

我实际上可以将currSessionID分配给成功,但这会破坏类的神圣性。我已经看到其他解决方案,比如使用“完成”,不确定这是否有帮助。

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

我修改了以下代码

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

现在好吗?

由于 阿贾伊

3 个答案:

答案 0 :(得分: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);
        }
    });
}

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

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

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

答案 1 :(得分:0)

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

上的jQuery文档

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

答案 2 :(得分:0)

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

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