是否可以使用jQuery的.when()和ajax调用的forEach循环?

时间:2013-04-17 22:19:19

标签: jquery ajax

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

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

StackOverflow上的这篇文章展示了如何在明确定义所有ajaxRequests时如何执行此操作的示例:Wait until all jQuery Ajax requests are done?我想知道是否有可能以某种方式实现与循环相同的效果?

我目前有这段代码,但并不等待所有代码完成:

_.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建议的道路前进,创造了一个巨型模型,但这增加了许多其他复杂性。因此,我们现在只需让用户保存,然后在标签之间进行更改。

1 个答案:

答案 0 :(得分: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()的行为;如果返回undefinednull,它不会向结果数组添加元素。