等待$ .post回答

时间:2012-05-26 13:13:29

标签: php javascript jquery

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

2 个答案:

答案 0 :(得分:4)

你不能让你的“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");
    }
  }

或其他什么。

答案 1 :(得分:0)

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回调中,因此在请求完成之前不会返回。正如其他人所建议的那样,最好是变得更加复杂并且有类似的东西:

  1. 一个微调器或“检查”或某种反馈,假设请求的时间超过一毫秒。

  2. freelogin实际返回有意义的内容。假设正在等待对输出“不可用”的响应的另一个函数调用它你应该没问题,但如果你只是输出freelogin或者有一些代码立即依赖于响应,那么你将会需要进一步改进以使您的脚本异步。

  3. 最后一点建议,这是一个收紧回调函数的好方法:

    $.post ('freelog.php', data, function(response){
                return (Number(response) <= 1) ? Boolean(Number(response)) : response;
        });