我为此寻找了很多地方,我可能是个白痴,因为这已经做了很多,但这是我的情况。
如果电子邮件尚未用于注册,我试图在我的网站上的电子邮件字段旁边显示一个复选框。
我所拥有的是这样的:
$('[name=reg_email]').change( function() {
if(!emailUsed()) {
//Update image to be a green checkmark
} else {
//Update image to be a huge red X
}
}
我的“emailUsed”函数应该返回一个Javascript布尔变量,具体取决于电子邮件地址是否在数据库中。为了促进这一点,我创建了一个脚本,用于确定它是否存在。所以emailUsed()函数只需要调用脚本并返回,但我需要等到readystate == 4才能返回,并且我找到等待readystate等于4的所有方法都阻止我返回一个值在所有:
function emailUsed() {
var req = $.get('scripts/email_used.php?email='+$('[name=reg_email]').val());
//Wait for req.readystate to be 4
return req.responseText == 'True';
}
但我无处可寻找解释如何做到并仍然返回值的东西。一切似乎都使用回调函数和这个,但我不能让这个方法返回一个值。
请帮助!
答案 0 :(得分:2)
忙于等待req.readyState === 4被认为是糟糕的设计实践。您正在占用UI线程并阻止浏览器更新。如果服务器响应缓慢,将提示用户是否取消进一步处理。
如果你看一下$ .get(),它需要一个完成函数作为它的一个参数。您应该在此功能中执行成功/失败逻辑。您可以通过禁用“提交”按钮直到收到成功消息来执行此操作。
答案 1 :(得分:0)
你错过了异步方法的重点。重点是要进行一些计算,并且您不希望占用等待该计算的当前线程。因此,长时间运行的方法不应该返回值,而是应该提供一个将传递调用状态的回调,而不会使整个应用程序等待。
我建议以下
function emailUsed (callback) {
var req = $.get('scripts/email_used.php?email='+$('[name=reg_email]').val(),
function(data) {
callback(data == 'True');
}
);
}
$('[name=reg_email]').change( function() {
emailUsed(function(isUsed){
if (isUsed) {
//Update image to be a green checkmark
} else {
//Update image to be a huge red X
}
});
}