0

我有这个 JS 循环:

          for (var i = 0; i < jsArr.length; ++i) {
            $.post("checkdata.php", { names: jsArr[i], platforms: "1" })
            .done(function(data) {
                eval(data);
            });
          }

data是一些 jQuery CSS 操作。我有一个加载图像,它位于页面加载时显示的“loadingImg”div 类下。checkdata.php检查namesAPI https://www.xboxleaders.com/

$('#loadingImg').hide();在循环和 jQuery.done进程完成后完成(隐藏图像)的最佳方法是什么?

我曾考虑在循环之后添加它,但这并不能保证checkdata已经完成。

4

4 回答 4

3

$.when 可用于组合 deferred,并在所有这些都解决时解决。

var defs = [];
for (var i = 0; i < jsArr.length; ++i) {
  defs.unshift($.post("checkdata.php", { names: jsArr[i], platforms: "1" }));
  defs[0].done(function(data) {
    eval(data);
  });
}

$.when.apply($, defs).done(function() {
  $('#loadingImg').hide();
});
于 2013-07-20T22:32:57.570 回答
1

使用计数器:

      var counter = 0;
      for (var i = 0; i < jsArr.length; ++i) {
        $.post("checkdata.php", { names: jsArr[i], platforms: "1" })
        .done(function(data) {
            counter++;
            eval(data);
            if(counter == jsArr.length){
                $('#loadingImg').hide();
            }
        });
      }
于 2013-07-20T22:27:44.320 回答
0

你最好使用瀑布

这个问题会很有帮助

于 2013-07-20T22:31:42.060 回答
0

对此的一种解决方案是创建第二个数组,该数组具有与 jsArr 相同数量的元素。在每个 .done 上,将第二个数组的相应索引设置为 true。然后在每次调用 .done 时,检查第二个数组的所有值是否为真,如果是,则隐藏。(或者您可以将一个新值推入第二个数组并检查数组的长度是否相同以使隐藏生效)

doneChecks = [];
for (var i = 0; i < jsArr.length; ++i) {
    $.post("checkdata.php", { names: jsArr[i], platforms: "1" })
        .done(function(data) {
            doneChecks.push(true);
            eval(data);
            if (doneChecks.length == jsArr.length)
                $('#loadingImg').hide(); 
    });
}
于 2013-07-20T22:33:23.817 回答