Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript/jQuery中,超时与使用内容加载异步调用倒计时相比有哪些优点和缺点_Javascript_Jquery_Asynchronous - Fatal编程技术网

在JavaScript/jQuery中,超时与使用内容加载异步调用倒计时相比有哪些优点和缺点

在JavaScript/jQuery中,超时与使用内容加载异步调用倒计时相比有哪些优点和缺点,javascript,jquery,asynchronous,Javascript,Jquery,Asynchronous,按照我的想法,我可能过度使用递归解决方案 等待2秒钟,以便加载第一组模块: function loadContents() { $('[data-content]:not(.loaded)').each( function() { $(this).load($(this).data('content')); $(this).addClass('loaded'); }); } loadContents(); setInterval(loadContents, 2000);

按照我的想法,我可能过度使用递归解决方案

等待2秒钟,以便加载第一组模块:

function loadContents() {
  $('[data-content]:not(.loaded)').each( function() {
    $(this).load($(this).data('content'));
    $(this).addClass('loaded');
  });
}
loadContents();
setInterval(loadContents, 2000);
加载所有第一组模块后,检查是否有新模块:

function loadContents() {
  var notLoaded = $('[data-content]:not(.loaded)'),
  notLoadedLength = notLoaded.length;
  notLoaded.each( function(i,element) {
    $(element).addClass('loaded');
    $(element).load($(element).data('content'), function() {
      // one more has been loaded
      notLoadedLength--;
      if (notLoadedLength == 0) {
        alert("countdown good");
        loadContents();
      }
    });
  });
}
loadContents();

您应该能够使用成功处理程序完成所有这些操作,并且不使用计时器进行轮询

您没有明确指定要执行的操作,但是如果您希望并行加载多个对象,并知道它们何时全部加载,那么您可以只保留一些关于加载了多少个对象的状态,当计数显示它们现在全部加载时,您就知道您完成了

如果您想按顺序加载它们,那么您可以从每个成功处理程序中加载下一个。创建一个要加载的东西的列表,并使用一个通用的成功处理程序来获取列表中的下一个,启动加载并将其从列表中删除,这可能是最简单的方法。当要加载的剩余项目列表为空时,您就完成了

编辑:进一步查看您的代码,看起来您正在并行加载它们。您只需为每个正在加载的类创建一个成功处理程序,在该成功处理程序中添加已加载的类,然后查看还有多少类尚未完成。我建议:

function loadContents() {
  $('[data-content]:not(.loaded)').each( function() {
    var obj = $(this);  // save in local variable in function closure so we can reference it in the success handler
    obj.load(obj.data('content'), function() {
        obj.addClass('loaded');
        if ($('[data-content]:not(.loaded)').length == 0) {
            // all pieces of content are now loaded
        } else {
            // some pieces of content are still loading
        }
    });
  });
}
loadContents();
编辑2:好的,根据您的评论,我现在更好地理解了这个问题。我将把loadContents的作用域限定到DOM树的父级,然后在成功处理程序中新加载的内容上调用它。这将适用于有限级别,而且是安全的,因为对于DOM树的任何给定父级,它只调用自己一次。当没有新内容要加载时,它就无所事事,因此不再调用自己。以下是我的建议:

function loadContents(root) {
  $('[data-content]:not(.loaded)', root).each( function() {
    var obj = $(this);  // save in local variable in function closure so we can reference it in the success handler
    obj.load(obj.data('content'), function() {
        obj.addClass('loaded');
        loadContents(obj);  // now load any contents from the newly loaded content
    });
  });
}
loadContents(document.body);   // start it off by looking in the whole DOM tree

你说得对:我不清楚。加载的代码中也可以包含数据内容,因此检查($('[data content]:not(.loaded')).length==0不太好用。现在它只有两层深度,我希望不会更深。好的,我在回答的末尾添加了一个新版本,可以加载任意级别的内容。非常感谢。非常干净。