在返回值之前,“等待”ReadyState为4

我已经为此寻找了很多地方,我可能是一个白痴,因为这已经做了很多,但这是我的情况。

我试图在我的网站上的电子邮件字段旁边显示一个复选框,如果该电子邮件尚未用于注册。

我所拥有的是这样的:

$('[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'; } 

但是我无处可以找到解释如何做到并仍然返回值的东西。 一切似乎都使用回调函数和这个,但我不能让这个方法返回一个值。

请帮忙!

忙于等待req.readyState === 4被认为是糟糕的设计实践。 您正在占用UI线程并阻止浏览器更新。 如果服务器响应缓慢,将提示用户是否取消进一步处理。

如果你看一下$ .get(),它需要一个完成函数作为它的一个参数。 您应该在此function中执行成功/失败逻辑。 您可以通过禁用“提交”按钮直到收到成功消息来执行此操作。

你错过了异步方法的重点。 重点是要进行一些计算,并且您不希望占用等待该计算的当前线程。 因此,长时间运行的方法不应该返回值,而是应该提供将传递调用状态的回调,而不会使整个应用程序等待。

我建议如下

 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 } }); }