3

我有一个 javascript 函数,我需要它在继续之前验证数据库中的一些信息。这是一个简单的布尔条件。如果为真,则继续,否则终止。问题似乎是javascript函数立即将函数调用评估为“假”,从而终止执行。它在函数实际返回之前执行此操作因此即使内部函数返回 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

验证失败 users.php:33

因此,您可以看到 if 条件输出字符串“已验证”,因此返回“真”结果。但主要功能是将其评估为“假”,字符串输出“验证失败”就证明了这一点。我能做些什么来纠正这个问题?

谢谢!

4

3 回答 3

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;

}

我希望这有帮助!:)

于 2013-07-06T18:44:21.520 回答
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);

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

于 2013-07-06T18:38:08.157 回答
0

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

删除用户()

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

验证会话()

function verifySession( callback ) {
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange  = callback;
  xmlhttp.open( "GET", "scripts/verifySession.php", true );
  xmlhttp.send();
}
于 2013-07-06T18:53:36.427 回答