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()> <代码> > <代码>缓存: