等待 $.post 答案



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

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

什么的。

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或有一些代码立即依赖于响应,你需要进一步修改以使你的脚本异步。

最后一点建议,这是加强回调函数的好方法:

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

最新更新