jQuery $ .each()不等待$ .Deferred()

时间:2018-05-14 11:29:00

标签: javascript jquery jquery-deferred

我有一个$.each()循环,循环选中一些复选框并为每个复选框调用ajax调用。显然,$.each()并没有等待ajax。我可以在ajax调用上放置ajax:false,但由于弃用警告,我不愿意。

因此,我尝试使用$.Deferred(),但每次迭代似乎都没有等待它。

以下是代码:

.each($checkboxes, function(key, checkbox) {
  $def = $.Deferred();
  $checkbox = $(checkbox);

  $.ajax({
    'url': 'ajax/myajaxcall.php',
    'data': {
       id: $checkbox.data('id')
     }
  }).complete(function() {
    console.log('done');
    $def.resolve('done');
  });

  return $def.promise();
});

实际解决方案

我完全了解如何使用ajax,但是上面的代码经历了许多重构和试验,以不同的方式来尝试获得我想要的结果。

我决定做的是放弃$ .each()并通过调用一个函数手动对话,通过调用一个函数,当完成后,用一个递增的键复选自己。

此解决方案100%确保ajax调用逐个运行。

var $checkboxes = $('input[name="mycheckboxes"]:checked'),
        checkboxKey = 0,
        checkboxLength = $checkboxes.length;


    function callAjax(key) {
        console.log(key);
        $checkbox = $($checkboxes[key]);
        console.log('call ajax');
        console.log($checkbox);

        $.ajax({
            'url': 'ajax/myajaxcall.php',
            'data': {
                'id': $checkbox.data('id')

            }
        }).complete(function() {
            console.log('done');
            if(key < checkboxLength-1) {
                key += 1;
                createInvoice(key);
            }
            else {
                console.log('complete');

            }
        });


    }

    if(checkboxLength > 0) {
        callAjax(checkboxKey);
    }

0 个答案:

没有答案