我有一个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'结果。但主要功能是将其评估为“假”,正如字符串输出“验证失败”所证明的那样。我该怎么做才能纠正这个问题?
谢谢!
答案 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();
}