等待数组中的ajax请求完成

时间:2013-08-27 19:45:14

标签: ajax jquery

我正在尝试遍历已检查复选框的ID(包含URL)。使用每个复选框,它会生成一个AJAX-get,它对数据库执行某个操作。这是有效的,但并非所有的AJAX似乎都被执行(重定向执行得太快)。

据我所知,我试图使用'$ .when.apply',但是,这似乎没有用。我在争论列表之后得到了一个'缺失',大多数肯定是在我推动ajax-get的部分生成的。

这是正确的方法还是我应该尝试其他方法?

$("#marksolved").click(function () {
    var ajaxrequests = [];

    // Loop through checkboxes.
    $('input:checked').each(function () {
        // Each id of a checkbox contains an URL.
        var markurl = $(this).attr('id');

        // Do the request.
        ajaxrequests.push($.ajax({
            method: 'GET',
            url: markurl,
            cache: false
        });
    });

    // Check if all requests have completed.
    $.when.apply($, ajaxrequests).then(function () {
        // All requests have completed. An ajax-redirect will eventually take place too fast...
        alert('All actions done!');

    });
});

4 个答案:

答案 0 :(得分:2)

我在参数列表之后得到'缺失',大多数肯定是在我推动ajax-get的部分生成的。

    ajaxrequests.push($.ajax({
        method: 'GET',
        url: markurl,
        cache: false
    });

应该是:

    ajaxrequests.push($.ajax({
        method: 'GET',
        url: markurl,
        cache: false
    }));

它错过了),就像错误一样。

旁注:将所有请求合并到一个批处理请求中而不是每个复选框都有一个请求可能效率更高。

答案 1 :(得分:1)

您可以使用$.ajaxStop()在所有ajax请求结束时引发事件,或在所有请求完成时使用$.ajaxComplete()

答案 2 :(得分:0)

尝试将ajax async选项设置为false

$.ajax({
    method:'GET',
    url: markurl,
    cache:false,
    async: false
});

答案 3 :(得分:0)

如果你知道你正在做多少个ajax请求,你可以这样做:

var ajax_count = 0;
var ajax_checker;
var ajax_n = 3;
$('input:checked').each(function() {
  ...
  ajaxrequests.push($.ajax({
    method:'GET',
    url: markurl,
    cache: false,
    success: function(){ ajax_count++; }
  });
}

// Check if all requests have completed.
function ajax_complete() {
  if (ajax_count >= ajax_n) {
    clearInterval(ajax_checker);
    //continue working
    alert('All actions done!');
  }
}

ajax_checker = setInterval(function() {ajax_complete();}, 50);