函数上的JQuery回调

函数上的JQuery回调,jquery,Jquery,我有以下行动: $('.sub_outworker').live('click', function() { var input = $(this); var current_div = input.parents('div.report'); var current_div_id = current_div.attr('id'); var replace_di

我有以下行动:

   $('.sub_outworker').live('click', function() {

                var input = $(this);
                var current_div = input.parents('div.report');
                var current_div_id = current_div.attr('id');
                var replace_div = current_div.children('div').first();
                var submission = submit_form(input, replace_div);
                var i = 0;
}
submit_form()函数如下所示:

function submit_form(input, replace_div) {
            var form = input.parents('form');

            loading_gif(replace_div);

             $.ajax({
                type: 'POST',
                url: form.attr('action'),
                data: 'ajax=true&' + form.serialize(),
                success: function(data) {
                    get_json();

                    if(data == 'success') {
                        return 'success';
                    }
                    else {
                        return 'failed';
                    }
                }
            });
        }

我想检查submission==是否失败,以及它是否再次运行submit_表单(即,给函数第二次工作机会-主要是因为它偶尔会由于令牌不匹配而导致验证失败)。但我不知道该怎么做

必须在
$.ajax()
回调中完成

$('.sub_outworker').live('click', function() {

    var input = $(this);
    var current_div = input.parents('div.report');
    var current_div_id = current_div.attr('id');
    var replace_div = current_div.children('div').first();
    submit_form(input, replace_div);
}

function submit_form(input, replace_div) {
    var form = input.parents('form');

    loading_gif(replace_div);

     $.ajax({
        type: 'POST',
        url: form.attr('action'),
        data: 'ajax=true&' + form.serialize(),
        success: function(data) {
            get_json();

            if(data == 'success') {
                submit_form.failCount = 0;
            }
            else if (!submit_form.failCount) {
                submit_form.failCount++;
                submit_form(input, replace_div);
            }
        }
    });
}

它必须在
$.ajax()
回调中完成

$('.sub_outworker').live('click', function() {

    var input = $(this);
    var current_div = input.parents('div.report');
    var current_div_id = current_div.attr('id');
    var replace_div = current_div.children('div').first();
    submit_form(input, replace_div);
}

function submit_form(input, replace_div) {
    var form = input.parents('form');

    loading_gif(replace_div);

     $.ajax({
        type: 'POST',
        url: form.attr('action'),
        data: 'ajax=true&' + form.serialize(),
        success: function(data) {
            get_json();

            if(data == 'success') {
                submit_form.failCount = 0;
            }
            else if (!submit_form.failCount) {
                submit_form.failCount++;
                submit_form(input, replace_div);
            }
        }
    });
}

如果您只想再运行一次,最简单(也是最干净)的方法可能是使用:

然后你可以做:

var request = submit_form(input, replace_div);
request.fail(function() {
    submit_form(input, replace_div);
}).done(function() {
   // request was successful, do something
});

延迟对象为异步调用提供了极大的灵活性,并允许您轻松地解耦代码。当然,如果您想将重复尝试进行Ajax调用视为
提交表单
函数的“功能”,或者如果您想重复多次,那么似乎是更好的方法。

如果您只想再次运行它,最简单(也是最干净)的方法可能是使用:

然后你可以做:

var request = submit_form(input, replace_div);
request.fail(function() {
    submit_form(input, replace_div);
}).done(function() {
   // request was successful, do something
});

延迟对象为异步调用提供了极大的灵活性,并允许您轻松地解耦代码。当然,如果您想将重复尝试进行Ajax调用视为
提交表单
函数的“功能”,或者如果您想重复多次,那么似乎是更好的方法。

您可以这样做吗?请注意,我不能100%确定您希望从服务器获得什么,或者您的页面的结构如何

function submit_form_ajax(serializedData, numAttempts) {

     numAttempts--;

     $.ajax({
        type: 'POST',
        url: form.attr('action'),
        data: 'ajax=true&' + serializedData,
        success: function(data) {
            get_json();

            if(data !== 'success') {
                if( numAttempts >= 1 ) {
                    submit_form_ajax(serializedData, numAttempts-1);
                }
            }
        }
    });

}

function submit_form(input, replace_div) {
    var form = input.parents('form');

    loading_gif(replace_div);

    submit_form_ajax(form.serialize(), 2);
}

你能这样做吗?请注意,我不能100%确定您希望从服务器获得什么,或者您的页面的结构如何

function submit_form_ajax(serializedData, numAttempts) {

     numAttempts--;

     $.ajax({
        type: 'POST',
        url: form.attr('action'),
        data: 'ajax=true&' + serializedData,
        success: function(data) {
            get_json();

            if(data !== 'success') {
                if( numAttempts >= 1 ) {
                    submit_form_ajax(serializedData, numAttempts-1);
                }
            }
        }
    });

}

function submit_form(input, replace_div) {
    var form = input.parents('form');

    loading_gif(replace_div);

    submit_form_ajax(form.serialize(), 2);
}


您无法从
success
回调中返回任何值。
submit\u form
不会返回任何值。这可能解释了为什么我无法更早地尝试工作!一旦成功回调完成,是否可以返回某些内容,或者执行任何后续操作也需要放置在回调中?@MΓΓ:嗯,即使延迟对象也只接受回调。因此,如果你处理异步代码,你可以说一切都必须通过回调来处理。你不能从
成功
回调返回任何值。
提交表单
不会返回任何值。这可能解释了为什么我不能更早地尝试工作!一旦成功回调完成,是否可以返回某些内容,或者执行任何后续操作也需要放置在回调中?@MΓΓ:嗯,即使延迟对象也只接受回调。因此,如果你处理异步代码,你可以说所有的事情都必须通过回调来处理。利用延迟对象变得更加灵活也很有趣,但这是一个简单的解决方案+1:)看起来我们发布了类似的答案。我能看到的唯一区别是,我稍微进行了重组,以避免重新序列化表单上的数据…@bland:Ooook,有这么多支持;)我最初的解决方案建议使用由
$.ajax
返回的延迟对象,但只有在请求本身失败的情况下才会失败,而不是当您只是得到与
成功
不同的值时。不过,您仍然可以使用自己的延迟对象。查看我的更新答案。@MΓΓББLL是一个近在咫尺的东西,使用了Felix递延对象suggestion@bland_dan不用担心,我同意他的解决方案对于一次性重试来说更干净。利用延迟对象变得更灵活也很有趣,但这是一个简单的解决方案+1:)看起来我们发布了类似的答案。我能看到的唯一区别是,我稍微进行了重组,以避免重新序列化表单上的数据…@bland:Ooook,有这么多支持;)我最初的解决方案建议使用由
$.ajax
返回的延迟对象,但只有在请求本身失败的情况下才会失败,而不是当您只是得到与
成功
不同的值时。不过,您仍然可以使用自己的延迟对象。查看我的更新答案。@MΓΓББLL是一个近在咫尺的东西,使用了Felix递延对象suggestion@bland_dan不用担心,我同意他的解决方案对于一次性重试来说更干净。