我有以下代码来检查用户名是否已存在。它对另一个页面使用AJAX请求,此页面返回1(用户名存在)或0(用户名不存在)。
function checkUsername(username,callback){
$.ajax({
url: '/check_username.php',
type: 'post',
data: {username: username},
dataType: 'json',
success : function(data){
switch(data.response){
case 0:
callback(true);
break;
case 1:
callback(false);
break;
}
}
});
};
var error; // 'undefined' for now
checkUsername('abc',function(data){
if(data == false){
// username exists
error = true;
}else{
// username does not exist
error = false;
};
});
if(error == false){
alert('username does not exist');
}else{
alert('username exists');
};
问题
代码检查error = true
(存在错误,即用户名存在)或error = false
,但代码仍在运行。它不会等到checkUsername
中的AJAX请求完成。所以总是“用户名存在”(因为error = undefined
,if-else然后转到else语句)。
问题
我怎样才能确保代码等到AJAX请求(checkUsername
函数)完全完成后再继续。
我有一个“部分”解决方案:当我在error = true
中包装检查false
/ setTimeout
的if-else语句时,它有效。问题是:多少毫秒?我希望尽可能快地拥有它。 500ms的?如果没有完成AJAX响应怎么办? 1000毫秒?那不是太长了吗?
我认为有一个更好的解决方案,而不是使用setTimeout
。有人有想法吗?
答案 0 :(得分:3)
if(error == false){
alert('username does not exist');
}else{
alert('username exists');
};
目前您的上述代码 在javascript之上,无论你是否调用你的ajax,它总是被执行。所以把它放到其他函数中并在调用checkUsername()之后调用它。
function checkUsername(username,callback){
$.ajax({
url: '/check_username.php',
type: 'post',
data: {username: username},
dataType: 'json',
success : function(data){
switch(data.response){
case 0:
callback(true);
break;
case 1:
callback(false);
break;
}
}
});
};
var error; // 'undefined' for now
checkUsername('abc',function(data){
if(data == false){
// username exists
error = true;
}else{
// username does not exist
error = false;
};
alertMsg();
});
function alertMsg(){
if(error == false){
alert('username does not exist');
}else{
alert('username exists');
}
}
答案 1 :(得分:1)
在ajax函数上尝试使用async:false
async(默认值:true) 类型:布尔值 默认情况下,所有请求都是异步发送的(默认设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。从jQuery 1.8开始,不推荐使用async:false和jqXHR($ .Deferred);您必须使用success / error / complete回调选项而不是jqXHR对象的相应方法,例如jqXHR.done()或不推荐使用的jqXHR.success()。
答案 2 :(得分:1)
将async设置为FALSE,直到ajax请求完成后才会移动。
function checkUsername(username,callback){
$.ajax({
url: '/check_username.php',
type: 'post',
data: {username: username},
dataType: 'json',
async : false,
success : function(data){
switch(data.response){
case 0:
callback(true);
break;
case 1:
callback(false);
break;
}
}
});
};
var error; // 'undefined' for now
checkUsername('abc',function(data){
if(data == false){
// username exists
error = true;
}else{
// username does not exist
error = false;
};
});
if(error == false){
alert('username does not exist');
}else{
alert('username exists');
};
答案 3 :(得分:1)
我有同样的问题无法找到任何方法,但这对我有用。
function sendAjax(){
var defObj = $.Deferred();
//my ajax code here
defObj.resolve(ajaxResponse);
return defObj.promise();
}
答案 4 :(得分:0)
AJAX(以及JavaScript的许多其他功能)都是异步的,这意味着你不要等待某些事情发生,但是rater会告诉JavaScript什么时候发生什么事情。在你的例子中,你试图等待'直到AJAX-Request完成,但你应该做的是告诉JavaScript在请求完成时执行你的代码,这意味着,把代码放在回调中。
答案 5 :(得分:0)
即使您使用了AJAX的回调,也就是检查的方式 条件仍然是异步的..
checkUsername('abc',function(data){
alermsg(data);
});
function alertmsg(data){
!data?alert('username does not exist'):alert('username exists');
}