我有几种表格,我想立即发布到我的服务器。然后,我想听他们所有人完成。如果我听到他们全部成功完成,我将采取一个行动,如果我看到一个失败,我将采取不同的行动。
我相信我应该使用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建议的道路前进,创造了一个巨型模型,但这增加了许多其他复杂性。因此,我们现在只需让用户保存,然后在标签之间进行更改。
答案 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()
的行为;如果返回undefined
或null
,它不会向结果数组添加元素。