是否可以使用jQuery';s.when()与ajax调用的forEach循环?

是否可以使用jQuery';s.when()与ajax调用的forEach循环?,jquery,ajax,Jquery,Ajax,我有几张表格想一次发到我的服务器上。然后,我想听听他们是否都完成了。如果我听到他们全部成功完成,我将采取一个行动,如果我看到一个失败,我将采取不同的行动 我认为应该使用jQuery的.when(): 这篇关于StackOverflow的文章展示了一个例子,说明了当您明确定义了所有ajaxRequests时如何做到这一点:我想知道是否有可能以某种方式通过循环实现相同的效果 我目前有此代码,但它不会等待所有代码完成: _.each($('form'), function (form) {

我有几张表格想一次发到我的服务器上。然后,我想听听他们是否都完成了。如果我听到他们全部成功完成,我将采取一个行动,如果我看到一个失败,我将采取不同的行动

我认为应该使用jQuery的.when():

这篇关于StackOverflow的文章展示了一个例子,说明了当您明确定义了所有ajaxRequests时如何做到这一点:我想知道是否有可能以某种方式通过循环实现相同的效果

我目前有此代码,但它不会等待所有代码完成:

_.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建议的道路,创建了一个巨大的模型,但这增加了大量其他复杂性。因此,我们现在只需让用户在切换选项卡之前进行保存。

您可以这样使用

不幸的是,
jQuery.when
期望每个
Deferred
作为一个单独的参数,而不是一个
Deferred
数组;这就是为什么我们要和你一起跳圈

还应注意以下人员的行为:;如果返回
undefined
null
,则不会将元素添加到结果数组中。

可以这样使用

不幸的是,
jQuery.when
期望每个
Deferred
作为一个单独的参数,而不是一个
Deferred
数组;这就是为什么我们要和你一起跳圈


还应注意以下人员的行为:;如果返回
undefined
null
,则不会向结果数组添加元素。

设计错误。一次性提交所有表单的数据。一个要求,一个承诺。你能再深入一点吗?如果有很多数据要发布,而我不想发布过大的帖子,会发生什么?另外,我的一些表单可能不脏,因此接收服务器端方法必须容纳可变数量的模型,而不是让每个服务器端方法在接收相应的POST时单独响应?此外,我希望对每个表单的错误回调有不同的响应。如果我只有一个错误回调,这会很复杂,因为我必须找出哪些回调有错误。除非有标准的方法/实用程序,否则这需要一点思考,基本上涉及到所有序列化表单的串联,以及标识每个数据集的表单ID。在服务器端,您可能需要一些自定义的请求解析来分隔每个表单的各个数据项。然后,您将拥有处理所有表单数据所需的所有数据,并组成一个复合(JSON编码)响应,其中包括用于标记数据的表单ID。回到客户端,循环响应并相应地采取行动。简单!:-)最大POST大小由服务器确定,通常以兆字节而不是千字节为单位。您通常需要大量的大型表单才能超过最大值。糟糕的设计。一次性提交所有表单的数据。一个要求,一个承诺。你能再深入一点吗?如果有很多数据要发布,而我不想发布过大的帖子,会发生什么?另外,我的一些表单可能不脏,因此接收服务器端方法必须容纳可变数量的模型,而不是让每个服务器端方法在接收相应的POST时单独响应?此外,我希望对每个表单的错误回调有不同的响应。如果我只有一个错误回调,这会很复杂,因为我必须找出哪些回调有错误。除非有标准的方法/实用程序,否则这需要一点思考,基本上涉及到所有序列化表单的串联,以及标识每个数据集的表单ID。在服务器端,您可能需要一些自定义的请求解析来分隔每个表单的各个数据项。然后,您将拥有处理所有表单数据所需的所有数据,并组成一个复合(JSON编码)响应,其中包括用于标记数据的表单ID。回到客户端,循环响应并相应地采取行动。简单!:-)最大POST大小由服务器确定,通常以兆字节而不是千字节为单位。您通常需要大量大型表单才能超过最大值。这看起来很棒。让我试一下,等一下这看起来棒极了。让我试一下,等一下
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
});