使用ajax提交表单,与回调异步

时间:2014-02-15 11:24:25

标签: javascript jquery ajax

我意识到SO已经加载了关于这个主题的材料,我已经完成了它,但似乎无法让它发挥作用。

我的函数接受JSON响应,解析它并在成功时返回false并在出错时返回true(这是故意的倒退)。

console.log显示我收到了正确的响应,但我的函数不会返回(submitme仍然为false,尽管它在回调中更改为true。因此,该函数始终返回false。

我猜我的回调操作有问题,但我不确定我做错了什么。
我可能不在这里,但我认为回调是好的,它只是在脚本执行后执行(因此异步)。
但我的问题仍然存在,如果只通过ajax更改布尔值,在这种情况下如何才能使表单提交为真?

这是我的代码段:

$(".form").submit(function(){
    error = $("#error");
    var submitme = false;

    function ajaxCall(url, type, data, callback) {
    $.ajax({
        url: url,
        type: type,
        data: data,
        success: function(response){
            try {
            obj = JSON.parse(response);
            text = obj.Error;
            error.html('');
            error.append(text);
            //if the json was parsed, return false
            submitform = false;
            }
            catch (error) {
                //if an error was thrown, return true
                submitform = true;
                }
            callback(submitform);
        },
    });

    }

    function ajaxCallSuccess(submitform) {
        console.log(submitform); //This shows correct output!
        if (submitform == 'true'){ //Here I want to manipulate the global submitme variable so I can submit the form on "true"
            submitme = true; //<-- this (I think) changes the global variable asynchronousy (so after the function is read), hence the outer function always returns false
        }

    };

    ajaxCall(url, type, data, ajaxCallSuccess);


    if (submitme == true) {
        return true;
    }
    else {
        return false;
    }
});

修改
我编辑了这篇文章,或许可以稍微澄清一下这个问题

2 个答案:

答案 0 :(得分:1)

您需要始终返回false,然后在AJAX调用成功的情况下手动提交表单:

$('.form').submit(function() {
    function ajaxCall(url, type, data, callback) {
        $.ajax({
            url: url,
            type: type,
            data: data,
            dataType: 'json',
            success: function(response) {
                callback(true);
            },
            error: function() {
                callback(false);
            }
        });
    }

    var form = $(this);

    function ajaxCallSuccess(submitform) {
        if (submitform) {
            // submit the form here:
            form[0].submit();
        }
    };

    ajaxCall(url, type, data, ajaxCallSuccess);

    return false;
});

答案 1 :(得分:-1)

  

我意识到SO已经加载了关于这个主题的材料,我已经完成了它,但似乎无法让它发挥作用。

为什么呢?你有没有理解那里解释了什么......?

  

但我的问题仍然存在,如果只通过ajax更改布尔值,在这种情况下如何才能使表单提交为真?

不能从异步处理程序中返回一个值,并期望该值在其后面的代码中可用,因为异步执行的。以下代码不会“等待”异步操作完成,这是异步的整个 point

因此,请立即取消提交表单 - 然后在您的回调函数中提交表单(如果适用)。