如果ajax结果为true,我需要函数返回true

use*_*717 0 javascript ajax jquery

这是我的代码:

    function validateField(field, input) {

    if (field && input) { 

        $.ajax({
            type: 'POST',
            url: '<?php echo site_url("ajax/verify"); ?>',
            dataType: 'json',
            data: { 'field' : field, 'input' : input},
            success: function(result) {
                var available = result.available;
                if (available == 1) {

                   // return true (for the entire function);
                }

            }
        });
    } 

    return false;


}
Run Code Online (Sandbox Code Playgroud)

zer*_*kms 6

现在最正确的做法是使用$.Deferred:

function validateField(field, input) {
    if (field && input) { 
        return $.ajax({
            type: 'POST',
            url: '<?php echo site_url("ajax/verify"); ?>',
            dataType: 'json',
            data: { 'field' : field, 'input' : input}
        }).pipe(function(result) {
            var available = result.available;
            return available == 1;
        });
    }

    return $.Deferred().resolve(false);
}

validateField('somefield', 'someinput')
    .done(function(result) {
        if (result) {
            alert('it is true');
        } else {
            alert('it is false');
        }
    });
Run Code Online (Sandbox Code Playgroud)

和基于回调的解决方案(我不喜欢它;-):

function validateField(field, input, callback) {
    var cb = $.isFunction(callback) ? callback : $.noop;

    if (field && input) { 
        $.ajax({
            type: 'POST',
            url: '<?php echo site_url("ajax/verify"); ?>',
            dataType: 'json',
            data: { 'field' : field, 'input' : input},
            success: function(result) {
                var available = result.available;
                cb(available == 1);
            }
        });
        return;
    }

    cb(false);
}

validateField('somefield', 'someinput', function(result) {
    if (result) {
        alert('it is true');
    } else {
        alert('it is false');
    }
});
Run Code Online (Sandbox Code Playgroud)

  • @Matchu:1.是的,deferreds是一种处理ajax结果的首选方法,因为自jquery 1.8以来不推荐使用`success`回调.2.这是一篇关于如何处理它的惊人文章:http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/ (2认同)