我试图让我的jQuery同步ajax调用返回一个布尔值,但是当我测试返回值时我得到的只是'undefined'。
jQuery代码:
function foo() {
var username = "hello"
if (checkUsernameExist(username)) {
//do something here
}
}
function checkUsernameExist(username) {
return $.ajax({
type: 'POST',
url: "check_username.php",
data: { username: username},
async: false,
}).responeText;
}
PHP代码:
<?php
//sets up connection (among other things)
include 'common.php';
//check we have username post var
if(isset($_POST['username']))
{
//check if its an ajax request, exit if not
if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') {
die();
}
$un = $_POST['username'];
//check username in db
$results = pg_query($con,"SELECT * FROM users WHERE username='{$un}'");
//return total count
$username_exist = pg_num_rows($results); //total records
if ($username_exist == 1) {
echo true;
} else {
echo false;
}
}
?>
提前致谢。
答案 0 :(得分:3)
我主要使用成功回拨,它有效:
function checkUsernameExist(username) {
var Exists;
$.ajax({
type: 'POST',
url: "check_username.php",
data: { username: username},
async: false,
success: function(response){
Exists = response;
}
})
reutrn Exists;
}
注意:强>
建议不要将Ajax调用同步,因为它们会停止浏览器上的UI。如果Ajax通话需要很长时间才能完成,则用户无法在网站上执行任何操作,直到完成为止。
答案 1 :(得分:1)
jQuery ajax()函数返回一个promise对象。由于Ajax调用是异步的,因此您需要一种方法来确保它们始终成功完成。 promise对象可以让你为:
编写逻辑.done()
功能成功完成的通话。.fail()
功能检查服务器端是否发生错误。.always()
功能运行代码,无论状态如何。.when()
和.then()
)。然而,这是我个人没有合作过的。以下内容适用于您:
<强> JS:强>
function foo() {
var username = "hello"
checkUsernameExist(username, function (status) {
// Do something here
});
}
function checkUsernameExist(username, callback) {
$.ajax({
type: 'POST',
url: "check_username.php",
data: { username: username},
async: true
}).done(function (data) {
callback(data.result === true);
}).fail(function (jqXhr, textStatus, errorThrown) {
callback(false);
});
}
PHP (原谅我,因为我不熟悉PHP。重点是返回JSON。
if ($username_exist == 1) {
echo '{"result": true}';
} else {
echo '{"result": false}';
}
您可以在此处详细了解Deferreds: