3

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

正如建议的那样,我尝试使用'$.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

4 回答 4

2

我在参数列表后得到一个“缺少的”,这肯定是在我推动 ajax-get 的部分生成的。

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

应该:

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

它缺少一个),就像错误所说的那样。

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

于 2013-08-27T19:51:10.737 回答
1

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

于 2013-08-27T19:53:41.667 回答
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);
于 2013-08-27T19:56:06.257 回答
0

尝试将 ajax 异步选项设置为 false

$.ajax({
    method:'GET',
    url: markurl,
    cache:false,
    async: false
});
于 2013-08-27T19:50:14.290 回答