我正在使用下面的 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 需要一些时间来回答......我不知道如何解决这个问题...希望,你会帮助我:)
你不能让你的"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");
}
}
什么的。
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;
});