1

我有几个表格我想一次发布到我的服务器。然后,我想听他们所有人完成。如果我听到它们都成功完成,我将采取一项行动,如果我看到一项失败,我将采取不同的行动。

我相信我应该使用 jQuery 的 .when():http ://api.jquery.com/jQuery.when/

StackOverflow 上的这篇文章展示了一个示例,说明当您明确定义了所有 ajaxRequests 时如何做到这一点:等到所有 jQuery Ajax 请求都完成?我想知道是否有可能以某种方式通过循环达到相同的效果?

我目前有这段代码,但它不会等待全部完成:

_.each($('form'), function (form) {
            var $form = $(form);

            if ($form.valid()) {
                //  Post form data
                $.ajax({
                    url: $form.attr('action'),
                    type: $form.attr('method'),
                    data: getFormData($form),
                    success: function () {}
                    error: function(){}
                });
            }
        });

编辑:虽然我接受了一个答案.. 值得注意的是,正确的“答案”正在改变设计要求。我们意识到,如果另一笔交易失败,撤销一笔交易将非常困难,但我们必须将所有交易保持在同一状态。这使我们走上了 Beetroot 建议的道路,创建了一个巨大的模型,但这增加了许多其他复杂性。因此,我们现在只需在选项卡之间切换之前让用户保存。

4

1 回答 1

1

你可以jQuery.when这样使用;

jQuery.when.apply(jQuery, $('form').map(function () {
    var $form = $(form);

    if ($form.valid()) {
        //  Post form data
        $.ajax({
            url: $form.attr('action'),
            type: $form.attr('method'),
            data: getFormData($form),
            success: function () {}
            error: function () {}
        });
    }

    // Otherwise don't do anything.
})).done(function (form1Ajax, form2Ajax, formNAjax) {
    // All complete    
}).fail(function (form1Ajax, form2Ajax, formNAjax) {
    // One failed
});

不幸的是,jQuery.when期望每个参数都Deferred作为单独的参数给出,而不是 ; 的数组Deferreds。这就是为什么我们要通过apply.

还要注意map();的行为 undefined如果返回或返回,它不会将元素添加到结果数组null中。

于 2013-04-17T22:43:03.403 回答