jquery - 从回调函数(在post请求中)返回值到其内部的函数中?

时间:2011-08-11 21:07:53

标签: javascript jquery ajax callback

我有一个javascript函数,它将数据发布到验证脚本并从那里获取值。 post请求的回调函数返回一个布尔值,我试图让整个函数返回该布尔值。现在,回调函数返回正确的值,但函数本身不返回任何内容。这是代码:

function validate(request_type, request_text) {
    $.post("http://www.example.com/ajax/validate.php",{
        type: request_type, 
        text: request_text
    }, function(data) {
        return (data == "valid");
    });
}

我意识到这是一种“同步”调用,而这不是AJAX的意思,但我已经在validate.php(数据库调用等)中有很多函数,我无法在Javascript中实现,我看到像this one这样的线程谈论使用某种形式的处理程序。

当我在data语句中使用它时,我将如何编写一个简单的处理程序来使变量data == "valid"或布尔比较结果if/else可用(这是应该使用这个函数)?

编辑:例如,将使用布尔结果的if语句之一:

if (!validate('password',pass_new)) {
        $('#pass_new').addClass('error');
        $('#pass_confirm_new').addClass('error');
        $(error_string.format('Please enter a valid password.')).insertAfter('#pass_confirm_new');
        $('#pass_text_short').hide();
        $('#pass_text_long').show();

编辑:在我的HTML表单中使用onsubmit事件调用的函数:

function valid_pass_sett() {
    //code to remove errors left over from previous submissions - snipped
    pass_old = $('input[name=pass_old]').val();
    pass_new = $('input[name=pass_new]').val();
    pass_confirm_new = $('input[name=pass_confirm_new]').val();
    //some if statements that don't involve AJAX requests - snipped
    if (!validate('password',pass_new)) {
        $('#pass_new').addClass('error');
        $('#pass_confirm_new').addClass('error');
        $(error_string.format('Please enter a valid password.')).insertAfter('#pass_confirm_new');
        $('#pass_text_short').hide();
        $('#pass_text_long').show();
        return false;
    }

    return true;
}

我没有编辑此代码以包含已发布的更新代码,但我的问题是我如何return false停止表单提交?

4 个答案:

答案 0 :(得分:7)

function validate(request_type, request_text, callback) {
    $.post("http://www.example.com/ajax/validate.php",{
        type: request_type, 
        text: request_text
    }, function(data) {
        callback(data == "valid");
    });
}

使用方法是:

validate(request_type, request_text, function (isValid) {
    if(isValid) { 
        // do something
    } else {
        // do something if invalid
    }
});

答案 1 :(得分:4)

除非您进行同步 AJAX调用(您可能不想这样做),否则您根本不能。

如果在您的代码中的多个位置使用此功能,最好的选择可能是让接收功能。

这种方式不是依赖于从函数返回的结果,而是在某些代码中使用,而实际上是直接传递代码,因此可以确保能够使用响应。

var my_form = $('#my_form');

my_form.submit( valid_pass_sett );

function valid_pass_sett() {
    //code to remove errors left over from previous submissions - snipped
    pass_old = $('input[name=pass_old]').val();
    pass_new = $('input[name=pass_new]').val();
    pass_confirm_new = $('input[name=pass_confirm_new]').val();

    validate('password', pass_new, pswd_validation_callback); // async validation

    return false;  // cancel form submission
}

function validate(request_type, request_text, callback ) {
    $.post("http://www.example.com/ajax/validate.php",{
        type: request_type, 
        text: request_text
    }, callback );
}

function pswd_validation_callback( data ) {
    if ( data === 'valid' ) {
         // if valid, call the native .submit() instead of the jQuery one
        my_form[ 0 ].submit();
    } else {
         // Otherwise do your thing for invalid passwords.
         // The form has already been canceled, so no concerns there.
        $('#pass_new').addClass('error');
        $('#pass_confirm_new').addClass('error');
        $(error_string.format('Please enter a valid password.')).insertAfter('#pass_confirm_new');
        $('#pass_text_short').hide();
        $('#pass_text_long').show();
    }
}

编辑: 已更改为使用已发布的相关代码。

编辑: 更新以处理已发布的其他代码。为了清晰起见,将答案缩小到指定的函数。

答案 2 :(得分:1)

function validate(request_type, request_text) {
$.post("http://www.example.com/ajax/validate.php",{
    type: request_type, 
    text: request_text
}, function(data) {
    return (data == "valid");
}); }

你无法真正从'验证'返回AJAX调用的结果。您可以尝试在$ .post调用之前声明一个变量,让我们称之为'x',并在响应函数内部将值赋给该变量(x = data ==“valid”),并在$ .post块之外,但在'validate'函数内,返回该值。

function validate(request_type, request_text) {
var x;
$.post("http://www.example.com/ajax/validate.php",{
    type: request_type, 
    text: request_text
}, function(data) {
    x = data == "valid";
});
return x; }

真正的问题是即使帖子调用没有返回任何值,函数'validate'也会继续,所以它总是'false'。

你可以做的最好的事情就是在响应函数中调用另一个函数,这样你就可以确保在进入下一部分之前服务器调用结束了。

修改

我发布这个答案已经很久了。世界已发生变化,因此AJAX称之为。

现在我们有承诺;)

您仍然无法从函数返回直接值,但您可以返回 Promise 对象,该对象可以被引导到另一个 Promise ,第二个承诺将获得您从第一个返回的数据。

function validate(request_type, request_text) {

   var promise = $.ajax("http://www.example.com/ajax/validate.php",{
       type: request_type, 
      text: request_text
   });

function getStuff(data) {
    //Do something and return the data to the next promise
    return data;
}

promise.then(getStuff).then(function(data){
    // Do something else with data
});

}

答案 3 :(得分:0)

如果我正确理解了这个问题,只需将返回的值存储到HTML元素中,然后从自定义函数中返回元素值,即可实现所需:

    function validate(request_type, request_text){

       $.post("http://www.example.com/ajax/validate.php",{
          type: request_type, 
          text: request_text}, 
          function(data) {
             $('#someElement').text(data); 
          });

       //return the data by getting the value of the html element
       return $('#someElement').text();
}