jQuery同步Ajax请求返回'undefined'

时间:2014-05-29 17:55:50

标签: jquery ajax

我试图让我的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;
    }
}
?>

提前致谢。

2 个答案:

答案 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()功能运行代码,无论状态如何。
  • 链式Ajax调用(即.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: