我正在使用下面的ajax函数检查输入的登录是否已在我的数据库中注册...
function freelog(login) {
var data = {login:login};
$.post ('freelog.php', data, function(response){
if(response == '1') {
freelogin = true;
} else if(response == '0') {
freelogin = false;
} else {
freelogin = response;
}
});
return freelogin;
}
我当然遇到问题:
return freelogin;
原因是$ .post需要一些时间来回答......我不知道如何解决这个问题...希望,你会帮助我:))
答案 0 :(得分:4)
你不能让你的“freelog()”函数返回一个值,正如你已经想到的那样,所以让它接受第二个参数。这应该是响应可用时调用的函数。
function freelog(login, callback) {
var data = {login:login};
$.post ('freelog.php', data, function(response){
if(response == '1') {
freelogin = true;
} else if(response == '0') {
freelogin = false;
} else {
freelogin = response;
}
callback( freelogin );
});
}
JavaScript浏览器环境的异步性质倾向于将所有API推向该形式。
编辑 - 调用你的函数,然后,看起来像:
freelog( username, function( isOk ) {
if ( isOk ) {
// put a big green check mark next to the username field
}
else {
alert("That user name is taken");
}
}
或其他什么。
答案 1 :(得分:0)
Ajax是一种痛苦,因为异步的好处也有它的缺点(至少在我们认为它是常态之前)。
你需要在回调中返回结果,而不仅仅是设置变量,正如你所发现的那样,变量没有值,因为ajax仍然倾向于。以下是如何轻松更改代码的一个示例:
function freelog(login) {
var data = {login:login};
$.post ('freelog.php', data, function(response){
if(response == '1') {
freelogin = true;
} else if(response == '0') {
freelogin = false;
} else {
freelogin = response;
}
return freelogin;
});
}
我所做的只是将返回移动到post回调中,因此在请求完成之前不会返回。正如其他人所建议的那样,最好是变得更加复杂并且有类似的东西:
一个微调器或“检查”或某种反馈,假设请求的时间超过一毫秒。
让freelogin
实际返回有意义的内容。假设正在等待对输出“不可用”的响应的另一个函数调用它你应该没问题,但如果你只是输出freelogin
或者有一些代码立即依赖于响应,那么你将会需要进一步改进以使您的脚本异步。
最后一点建议,这是一个收紧回调函数的好方法:
$.post ('freelog.php', data, function(response){
return (Number(response) <= 1) ? Boolean(Number(response)) : response;
});