如何知道每个循环中JQuery的所有ajax调用何时完成?

时间:2016-07-31 04:09:07

标签: javascript jquery ajax

我在JQuery中有一个每个循环,我在其中触发ajax请求。在完成所有ajax调用后,我想显示一条成功消息。

我的代码如下,

$('.container input:checked').each(function() {
  json_data = $(this).parent().parent().find('.case_json').html()
  $.ajax({
    type: "POST",
    url: "/some_action",
    data: { json_data : json_data },
    success: function(data) {
      console.log('saved')
    }
  })
}).promise().done( function(){ $('#import_message').show().addClass('alert alert-success').html('Data imported successfully!') } );

但代码的问题是我的成功消息是在执行ajax调用之前显示的方式。

我做错了什么?或者我是否需要改变实施方式?

2 个答案:

答案 0 :(得分:0)

我认为你想建立一个承诺数组然后使用$ .when.apply。这里有一个类似的问题:What is cleanest way to turn Array of JQuery Promises into a JQuery Promise of an Array?

答案 1 :(得分:0)

您需要将使用$ .map函数与$ .when结合使用,以下是它的外观:

$.when.apply($, $('.container input:checked').map(function() {
  json_data = $(this).parent().parent().find('.case_json').html()
  return $.ajax({
    type: "POST",
    url: "/some_action",
    data: { json_data : json_data },
    success: function(data) {
      console.log('saved')
    }
  })
}))
.done( function(){ 
    $('#import_message').show().addClass('alert alert-success').html('Data imported successfully!') 
} );

Map函数会创建一个deffereds数组,这个数组被传递给$ .when函数,问题是它不支持数组作为参数,但支持任意数量的参数,所以我们可以使用.apply(),它接受promises数组并传递给函数作为参数。