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

Javascript jquery-将回调函数(在post请求中)的值返回到其内部的函数中?,javascript,jquery,ajax,callback,Javascript,Jquery,Ajax,Callback,我有一个javascript函数,它将数据发布到验证脚本并从中获取一个值。post请求上的回调函数返回一个布尔值,我试图让整个函数返回该布尔值。现在,回调函数返回正确的值,但函数本身不返回任何内容。代码如下: function validate(request_type, request_text) { $.post("http://www.example.com/ajax/validate.php",{ type: request_type, text

我有一个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实现的函数,我看到过类似这样的线程谈论使用某种形式的处理程序

当我在
if/else
语句中使用变量
data
或布尔比较的结果
data==“valid”
时,如何编写一个简单的处理程序,使其可用(这就是应该使用此函数的地方)

编辑:例如,将使用布尔结果的
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;
}
我没有编辑此代码以包含已发布的更新代码,但我的问题是如何从中返回false以停止表单提交?

除非您进行同步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();
    }
}

编辑:更改为使用问题中发布的代码

编辑:更新以使用发布的其他代码。为了清晰起见,将答案缩小到命名函数

其用途是:

validate(request_type, request_text, function (isValid) {
    if(isValid) { 
        // do something
    } else {
        // do something if invalid
    }
});
您不能真正从“验证”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; }
真正的问题是,即使post调用没有返回任何值,函数“validate”仍将继续,因此它将始终为“false”

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

编辑:

我已经很久没有发布这个答案了。世界已经发生了变化,因此AJAX调用

现在我们有了承诺;)

您仍然无法从函数返回直接值,但可以返回一个Promise对象,该对象可以更改为另一个Promise,第二个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
});

}

如果我正确理解了这个问题,您只需将返回值存储到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();
}

我也有同样的问题,有人向我提供了解决方案。并最终重新分解我的代码以满足我的需要,因为这无法很好地完成阅读此处您试图对返回值做什么,显示更多代码您可以尝试发布验证请求,然后在获得数据后调用一个函数来处理它。只需将父元素标识符与数据一起传递,您就可以将验证函数作为一个大开关运行->case当使用异步代码时,您只需放弃使用
validate()
函数返回值的希望。这根本行不通。您需要调整代码以适应异步流;但是,这与表单验证有什么关系呢?我用表单的onsubmit事件调用另一个函数(包含所有if/else语句的函数,其中一些使用validate()函数),该函数仅在返回false时停止表单提交。我将编辑我的答案,以包含该函数的代码。@pythonscript:您需要做的是立即停止提交,执行异步验证,传入需要验证结果的代码,然后如果成功,重新提交。您可能需要使用本机的
.submit()
函数,这样jQuery代码就不会再次运行。主要的一点是,提交不能等待异步代码来决定是否允许它。应假定不允许,然后在验证后,在未经验证的情况下重新提交。我会更新我的答案……另外,请记住客户端的验证很容易被禁用。您可能知道这一点,但我只是想确保您也在验证服务器端。@pythonscript:我刚刚更新了。是的,除了您不想调用jQuery的
.submit()
,因为它只会再次触发您的代码,您将进入一个无限循环。而是在本机DOM元素上触发
.submit()
,以便表单在未经验证的情况下提交(因为表单已经过验证)。现在,您可以将所有代码放在
valid\u pass\u sett()
函数中,并触发它,但您希望它接收一个可以测试的参数,这样当您重新触发它时,只有在第一次调用时才运行
validate()
函数,而不是重做。你的回答击中了我所寻找的本质。Thx.this将不起作用,因为$.post在可以放置值之前可能仍在工作。。。如果是,则函数返回.text(),它将具有旧值。
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
});

}
    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();
}