ajax返回true / false - 我已经实现了一个回调

时间:2014-04-15 08:43:12

标签: jquery ajax

首先,我已经阅读了这些主题jQuery AJAX function return true or false returning only false while its all goodWhat to return for jQuery's ajax data param in callback function?How return true or false function of data response ajax?,而我无法弄清楚如何使其发挥作用。

$("#btn_go").on('click', function(){
    if(validateUserDetails() == false){ 
            return;
    }
});

因此,函数validateUserDetails具有以下内容:

function validateUserDetails(){
    var bool = false;

    $.ajax({
        url: 'response.php?type=validateUserDetails',
        type: 'POST',
        dataType: 'json',
        data: {name: $("#checkout_name").val(), email: $("#checkout_email").val(), "country": $("#checkout_country").val(), 
               "city": $("#checkout_city").val()},
        success: function(data){
            console.log(data); // this is currently returning FALSE
                               // Which is totally correct!
            if(data == true){ bool = true; }
            return trueOrFalse(bool);
        }
    });
}

function trueOrFalse(bool){
    return bool;
}

但这不起作用,因为如果我输出函数我得到“未定义”,这意味着该函数没有重新调整正确的值。 console.log(validateUserDetails()); // = undefined

我在做什么?

3 个答案:

答案 0 :(得分:12)

ajax请求为asynchronous。不要使用sync: true选项,这不是一个好主意。 你可以做的是使用promise返回的ajax,所以:

function validateUserDetails(){

return $.ajax({
    url: 'response.php?type=validateUserDetails',
    type: 'POST',
    async: false,
    dataType: 'json',
    data: {name: $("#checkout_name").val(), email: $("#checkout_email").val(), "country": $("#checkout_country").val(), 
           "city": $("#checkout_city").val()},
    success: function(data){
        console.log(data); // this is currently returning FALSE
    }
  });
}
$("#btn_go").on('click', function(){
    validateUserDetails().done(function(data){
         if(data == "someValue")
            return "whatever you want";
    });
});

答案 1 :(得分:5)

由于还没有人回答,我会:

首先,您可以尝试同步请求

function validateUserDetails() {
    var bool = false;

    $.ajax({
            url: 'response.php?type=validateUserDetails',
            type: 'POST',
            async: false,
            dataType: 'json',
            data: {name: $("#checkout_name").val(), email: $("#checkout_email").val(), "country": $("#checkout_country").val(), "city": $("#checkout_city").val()},
            success: function(data) {
                console.log(data);  // this is currently returning FALSE
                                    // Which is totally correct!
                if (data == true) {
                    bool = true;
                }
            }
    });

    return trueOrFalse(bool);
}

如果不可接受,您可以使用$.Deferred()

function validateUserDetails() {
   var deferred = $.Deferred();
   var bool = false;

   $.ajax({
      url: 'response.php?type=validateUserDetails',
      type: 'POST',
      dataType: 'json',
      data: {name: $("#checkout_name").val(), email: $("#checkout_email").val(), "country": $("#checkout_country").val(), "city": $("#checkout_city").val()},
      success: function(data) {
      console.log(data);  // this is currently returning FALSE
                                            // Which is totally correct!
            if (data == true) {
                            bool = true;
                        }
                    }
      complete: function () {
                        deferred.resolve(trueOrFalse(bool));
                    }
      });

   return deferred.promise();
}

function trueOrFalse(bool){
        return bool;
}

function test() {
   var promise = validateUserDetails();
   promise.done(function(result) {
        console.log("Bool: " + result);
   });
}

答案 2 :(得分:1)

你的函数validateUserDetails没有返回值,她只是执行一个异步函数。 异步函数返回true或false,但没有用于捕获它。

就是这样:

function validateUserDetails(){

    // asynchronous function
    $.ajax({...});

    return undefined;
}

如果您尝试console.log(trueOrFalse(bool));,您将看到“true”或“false”,但您不能将“return”用于异步函数。你必须对成功函数做一些事情,使用“数据”(日志或其他函数)