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

时间:2010-12-02 21:52:21

标签: javascript jquery

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

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

我所拥有的是这样的:

$('[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 个答案:

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