2010-12-02 116 views
0

我已经在很多地方看过这个,我可能是个白痴,因为这样做很多,但这是我的情况。“等待”ReadyState在返回值前为4

我想在我的网站IFF电子邮件旁边的一个电子邮件字段中显示一个复选框未使用已注册。

什么我已经是这样的:

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

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

帮助,请!

回答

2

做一个忙等待req.readyState === 4被认为是不好的设计实践。你正在绑定UI线程并阻止浏览器更新。如果服务器响应速度慢,用户将得到提示是否取消进一步处理。

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

+0

太好了!谢谢。这本来对我来说有点困惑,但我明白了。 – TigerTrussell 2010-12-02 22:06:31

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