来自AJAX调用的javascript函数响应返回undefined

时间:2017-01-06 10:16:08

标签: javascript jquery ajax

希望通过ajax检查值以进行验证。我的功能获得了truefalse。但无法返回对函数callback_validation的响应。

当我在下面调用函数时,它返回undefined.

console.log(callback_validation('value',<object>)); /* here its returning undefined */
  

以上函数应该返回 TRUE FALSE

在此处找到我的动作javascript功能:

        function callback_validation($val,$field){
        var $jObj=[],$data={
            ci: $ci,
            ui: $ui
        };
        $data[$field.attr('name')]=$val;
        $jObj.push($data);
        console.log(JSON.stringify($jObj)); /* CONSOLE OUTPUT: [{"ci":"","ui":"4934","refno":"s"}] */
        $.ajax({
            url: $url,
            type: 'post',
            dataType: 'json',
            success: function (res) {           
                /* console.log(res.valid); */ /* here its returning true / false */
                return res.valid;
            },
            data: $data,
            error: function(xhr, desc, err) {
                console.log(xhr);
                console.log('Details: ' + desc + '\nError:' + err + '\n');
                return false;
            },
            cache: false
        });
    }

1 个答案:

答案 0 :(得分:2)

AJAX是异步的意思是你不能从callback_validation返回一个取决于AJAX调用结果的值。原因是因为success回调(这是你知道值的唯一地方)可以在函数返回后执行很多。

所以我建议你开始使用异步模式并让你的函数接受回调而不是返回一个值:

function callback_validation($val, $field, resultCallback) {
    var $jObj=[], $data={
        ci: $ci,
        ui: $ui
    };
    $data[$field.attr('name')]=$val;
    $jObj.push($data);

    $.ajax({
        url: $url,
        type: 'post',
        dataType: 'json',
        success: function (res) {           
            resultCallback(res.valid);
        },
        data: $data,
        error: function(xhr, desc, err) {
            console.log(xhr);
            console.log('Details: ' + desc + '\nError:' + err + '\n');
            resultCallback(false);
        },
        cache: false
    });
}

现在您可以像这样调用您的函数:

callback_validation('value',<object>, function(result) {
    console.log(result); // this will print true or false
});

如果您正在进行AJAX调用,那么您应该习惯的异步编程模式。