Javascript等待PHP函数返回

时间:2013-07-06 18:24:32

标签: php javascript ajax asynchronous

我有一个javascript函数,我要求它在继续之前验证数据库中的一些信息。这是一个简单的布尔条件。如果为true,则继续,否则终止。问题似乎是javascript函数立即将函数调用评估为'false',从而终止执行。它在函数实际返回之前执行,因此即使内部函数返回true,主函数也会错误地终止。

我还是js,php和ajax的新手。我猜这是异步php调用的结果。我对这个结论是对的吗?如果是这样,有没有办法让javascript函数暂停,直到它收到函数调用的结果?

这是我的代码。谢谢你的任何建议。

首先,使用onclick按钮调用主要的javascript函数(在文件'users.php'中):

function deleteUser() {

            //check for excessive inactivity
            if (verifySession()) {
                console.log("verified");
            } else {
                console.log("verification failed");  //<--line 33
                return false;
            }

            //continue on...

这是if语句调用的函数(在文件'session_handler.js'中):

function verifySession() {

    var xmlhttp = new XMLHttpRequest();

    xmlhttp.onreadystatechange=function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            var response = xmlhttp.responseText;
            console.log(response);                     //<--line 11
            if (response != "verified") {
                window.location.href = "signin.html";
                return false;
            } else {
                return true;
            }
        }
    }

    xmlhttp.open("GET", "scripts/verifySession.php", true);
    xmlhttp.send();
    return false;

}

这是输出:

  

验证了session_handler.js:11

     

验证用户失败.php:33

因此,您可以看到if条件输出字符串'verified',因此返回'true'结果。但主要功能是将其评估为“假”,正如字符串输出“验证失败”所证明的那样。我该怎么做才能纠正这个问题?

谢谢!

3 个答案:

答案 0 :(得分:1)

这是因为您xmlhttp.onreadystatechange=function()正在返回true,但verifySession()正在此处返回false

xmlhttp.open("GET", "scripts/verifySession.php", true);
xmlhttp.send();
return false;

我的想法是做这样的事情:

function verifySession() {

var xmlhttp = new XMLHttpRequest();


var returnValue = xmlhttp.onreadystatechange=function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
        var response = xmlhttp.responseText;
        console.log(response);                     //<--line 11
        if (response != "verified") {
            window.location.href = "signin.html";
            return false;
        } else {

           return true;

        }
    }
}

xmlhttp.open("GET", "scripts/verifySession.php", true);
xmlhttp.send();
return returnValue;

}

我希望这有助于! :)

答案 1 :(得分:0)

你无法以这种方式实现目标。在这段代码中:

function deleteUser() {

            //check for excessive inactivity
            if (verifySession()) {
                console.log("verified");
            } else {
                console.log("verification failed");  //<--line 33
                return false;
            }

            //continue on...

您使用verifySession()时的条件将始终评估为false,因为此函数本身不返回任何值。虽然您认为自己从onreadystatechange函数返回了一个值,但实际上并非如此。初始函数不会等待它,因为您将其作为异步请求发送。请尝试使用以下内容:

xmlhttp.open("GET", "scripts/verifySession.php", false);

但我必须警告你,使用synchronized ajax请求并不是一个好主意。它可能会冻结浏览器和东西..

答案 2 :(得分:0)

它在javascript中是不可能的,因为它不等待ajax请求返回值,所有你能做的就是这样......

<强> deleteUser()

function deleteUser() {
  var callback  = function() {
    if ( this.readyState === 4 && this.status === 200 ) {
      var response  = this.responseText;
      console.log( response );
      if ( response !== "verified" ) {
        window.location.href  = "signin.html";
        console.log( "verification failed" );
      }
      else {
        console.log( "verified" );
        //continue on...
        // here all your other codes from 'deleteUser()'
      }
    }
  };
  verifySession( callback );
  return false;
}

verifySession()

function verifySession( callback ) {
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange  = callback;
  xmlhttp.open( "GET", "scripts/verifySession.php", true );
  xmlhttp.send();
}