javascript和函数的执行顺序

javascript和函数的执行顺序,javascript,function,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

我的班级看起来像

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\u curr\u会话:call

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

我能在一次通话中完成吗?如果我有使用2个功能-我如何确保它一直工作

实际上,我可以将currSessionID设置为成功,但是这会破坏课堂的神圣性。我见过其他解决方案,比如使用“done”,不确定这是否有帮助

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

我修改代码如下

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

当我打电话时

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);
    }
}
现在好了吗

谢谢 Ajay

$.ajax()
对options对象中指定的url发出异步调用。请参阅

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

$.ajax()
对options对象中指定的url发出异步调用。请参阅


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

这是因为ajax请求的success和error函数是异步执行的

为了确保不会发生这种情况,您应该向save函数添加一个回调,该回调在成功或错误函数运行后调用

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(…)调用之后,而是在函数内部执行该操作。

这是因为ajax请求的success和error函数是异步执行的

为了确保不会发生这种情况,您应该向save函数添加一个回调,该回调在成功或错误函数运行后调用

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(…)调用之后执行此操作,而是在函数内部执行。

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


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

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


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

我不认为
classUser
中的
var
声明会重复您认为它们会做的事情。意思是说?它们完全按照我的要求做em to:)@ThoughtfulMonkey在您提供的代码中,函数
classUser
中的
var
语句对您的代码没有影响。它们将变量
userName
firstName
,…绑定到函数
classUser
的范围内,但由于它们没有在函数中使用,因此实际上是无用的t这一点。(
var userName;
this.userName
无关)@不,它们没有副作用,但是如果你想显示/你的类有什么属性,你应该用不同的方式标记它们,例如使用JSDoc.或者定义一个默认值
classUser.prototype.userName=null;
在你之外
classUser
。另一个注意:我建议选择一个命名对话如果将
user\u name
userName
混合在一起,通常会导致错误。我认为
classUser
中的
var
声明可能会重复,但我不认为这些声明会按照您的想法执行。意思是?它们完全按照我的要求执行:)@thoughtfullmonkey在您提供的代码中,函数中的
var
语句>classUser对您的代码没有影响。它们将变量
userName
firstName
,…绑定到函数
classUser
的范围内,但由于它们没有在函数中使用,因此在这一点上它们实际上是无用的。(
var userName;
this.userName
无关)@不,它们没有副作用,但是如果你想显示/你的类有什么属性,你应该用不同的方式标记它们,例如使用JSDoc.或者定义一个默认值
classUser.prototype.userName=null;
在你之外
classUser
。另一个注意:我建议选择一个命名对话如果在
var currSessionID=user.get\u session()之前以某种方式执行,
success
回调总是在当前执行流之后调用(比如写入
setTimeout(function(){..},0);
),如果它在
var currSessionID=user.get\curr\u session()之前执行然后,我会认为它是一个bug,因为它在<代码> AycNC <代码>调用应该如何工作时发生冲突。你是对的。我考虑调用<代码> $Ajax()> <代码> > <代码>缓存: