【问题标题】:create new element from array until array is empty every second从数组创建新元素,直到数组每秒为空
【发布时间】:2016-07-05 09:18:57
【问题描述】:

尝试使用每隔一秒随机选择的数组中的项目创建一个元素,直到数组为空。我很困惑为什么当我不将元素附加到 dom 时我的函数可以工作,但是一旦我添加到 dom,数组就会变得更大并最终导致 dom 崩溃。

我的计划是最终创建一个具有图像的新对象,具有随机 xy 位置的 css,然后使用对象值将新元素附加到 dom。

基本上,我试图每秒向 dom 添加随机图像,并让它们动画进出,直到数组为空。

任何帮助将不胜感激,谢谢。

    "load": function(){
        var imgArray = ['brain', 'mitochondria', 'microscope', 'beaker', 'beaker-2', 'scientist', 'cell', 'atom', 'dropper'];

        window.setInterval(function(){
            var imgItem;
            if( imgArray.length >= 1 ) {
                var index = Math.floor( Math.random()*imgArray.length );
                console.log( imgArray[index] ); // Log the item
                imgItem = ( imgArray[index] ); // Log the item

                imgArray.splice( index, 1 ); // Remove the item from the array
                // $('form').append('<img class="img-animation" src="img/science/'+ imgItem +'.svg" alt="'+ imgItem +'">');
            }
        }, 1000);

    },

这是我不附加新图像时的控制台:

home.js:11 beaker
home.js:11 dropper
home.js:11 microscope
home.js:11 beaker-2
home.js:11 atom
home.js:11 brain
home.js:11 scientist
home.js:11 cell
home.js:11 mitochondria

如果我将新图像添加到 dom 中,它最终会崩溃,并且循环会永远持续下去,这对我来说毫无意义。

【问题讨论】:

  • 您是否考虑过在每次迭代时记录数组的内容,然后它可能显示您为什么/哪里出错了。为了防止无限循环,在if 中使用另一个变量,例如:if (imgArray.length &amp;&amp; iterationLimit)(例如在初始化iterationLimit = 10 之后),这将只允许10 次迭代;在这两种情况下,0 都是错误的,所以一旦其中一个数字达到0if 的条件将是false,因此停止)。
  • 我也很想知道更新 DOM 后是否会重新调用这个“加载”回调。
  • 我使用 Meteor 作为我的框架
  • 我没有按照您所说的实现迭代限制的方式跟随您。我假设我应该在循环中每次迭代将限制减少一个?它看起来循环添加到 imgItem 变量,因为图像开始成对出现,好像每次迭代都加倍。

标签: javascript jquery arrays loops


【解决方案1】:

好吧,你正在设置一个间隔,它会在数组为空后每隔一秒自动检查一次,即使那不是问题,我建议你这样做:

var imgArray = ['brain', 'mitochondria', 'microscope', 'beaker', 'beaker-2', 'scientist', 'cell', 'atom', 'dropper'];

var getAllRandomly = function(arr) {
    if (arr.length) {
        var index = Math.floor(Math.random() * arr.length);
        console.log(arr[index]); // Log the item
        imgItem = (arr[index]); // Log the item
        imgArray.splice(index, 1); // Remove the item from the array
        setTimeout(function() {
            getAllRandomly(arr);
        }, 1000);
    }
    else {
        console.log('Array is empty');
    }
};

getAllRandomly(imgArray);

这样,函数会调用自己并每秒返回一个结果,直到数组为空。

现在进入真正的问题: 您的“加载”函数可能被多次调用,使用相同的数组设置了很多间隔。如果循环真的是无限的,那么它可能会以某种方式调用自己。 试着在你的加载函数上只留下一个控制台日志,然后运行你的脚本,看看日志是否出现了多次。

【讨论】:

  • 这正是我想要完成的,非常感谢!
猜你喜欢
  • 2021-03-22
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多