【问题标题】:Loop over array but with a time delay循环数组但有时间延迟
【发布时间】:2015-11-27 21:17:45
【问题描述】:

我正在尝试遍历一个数组。但是,我想在每个数组值之间添加 15 秒的延迟。这会将值 1 写入控制台,然后倒计时 15 秒并将值 2 写入控制台,依此类推。

我不确定该怎么做。我的代码现在只是在控制台上一次输出数字 15 到 1,没有实际倒计时,也没有数组值。

数组

["l3", "l4", "l5", "l6", "l7", "l8", "l9", "l10", "l11", "l12", "l13", "l14", "l15", "l16"] 

代码

var adArray = [];
// get links with class adfu
var adfuClass = document.getElementsByClassName('adfu');
for (var i = 0; i < adfuClass.length; i++) {
    var ids = adfuClass[i].id
    var newIds = ids.replace(/tg_/i, "l");
    adArray.push(newIds);
}
// get links with class ad30
var ad30Class = document.getElementsByClassName('ad30');
for (var i = 0; i < ad30Class.length; i++) {
    var ids = ad30Class[i].id;
     var newIds = ids.replace(/tg_/i, "l");
     adArray.push(newIds);
}
// get links with class adf
var adfClass = document.getElementsByClassName('adf');
for (var i = 0; i < adfClass.length; i++) {
    var ids = adfClass[i].id;
     var newIds = ids.replace(/tg_/i, "l");
     adArray.push(newIds);
}
// loop through array with all new ids
for (var i = 0, l = adArray.length; i < l; i++) {
    var counter = 15;
    var countDown = setTimeout(function() {
        console.log(counter);
        if (counter == 0) {
            console.log(adArray[i]);
        }
        counter--;
    }, 1000);
}

【问题讨论】:

  • 看看我制作的这个小提琴中的 wait() 函数:jsfiddle.net/9hBfs 这是一个模式,真的,setTimeout() 本身就是迭代器,而不是 forwhile 循环.
  • 就我个人而言,我喜欢使用setInterval(相对于setTimeout)和一个队列(相对于索引器),但是......同样的想法。
  • @pst - setInterval() 可以工作,但对我来说,对这些类型的循环迭代自调用 setTimeout() 是最直接和最简单的方法。由于它的实用性和简单性,这可能是我最喜欢的模式之一。

标签: javascript


【解决方案1】:
// loop through array with all new ids
var i = 0, l = adArray.length;
(function iterator() {
    console.log(adArray[i]);

    if(++i<l) {
        setTimeout(iterator, 15000);
    }
})();

这样的?

【讨论】:

  • 一,你从来没有打电话给countDown(),那么它在哪里/如何运行?而且你真的不需要for 循环;如果您适当地使用范围,您可以使 setTimeout() 成为迭代器。例如,将其全部包装在闭包或函数作用域中,包括调用setTimeout() 的嵌套函数和在包含setTimeout() 的函数中交互的父闭包作用域中的var loop
  • @ddlshack 啊!这就是我想要完成的,但有一个小的 tweek。控制台显示数组的长度我如何实际显示数组中的值
  • 检查我的更新。它将记录 adArray 的值。你想记录什么?
  • 完美,正是我所需要的。
  • arguments.callee 在 ECMAScript 第 5 版中已弃用。相反,函数名称应该是自引用的:例如(function process() { ...; setTimeout(process, ...); })。 (函数名称范围在 ECMAScript 第 3 版中定义。)
【解决方案2】:

这种类型的迭代器有一个非常简单的模式,使用闭包范围来存储loop 计数器和一个运行setTimeout() 迭代器的嵌套looper() 函数。 looper() 函数实际上迭代了loop 计数,因此不需要fordo/while 构造。我经常使用这种模式,而且效果很好。

编辑:修改条件以检查loop &gt; 1,而不是loop &gt; 0,它记录了Loop count: 0。这可以调整,从技术上讲,这里的looper() 运行了 16 次。

(function(){
    var loop = 15;

    var looper = function(){
        console.log('Loop count: ' + loop);

        if (loop > 1) {
            loop--;
        } else {
            console.log('Loop end.');
            return;
        }

        setTimeout(looper, 15000);
    };

    looper();
})();

http://jsfiddle.net/userdude/NV7HU/2

【讨论】:

  • 你可以只使用arguments.callee来引用当前正在执行的函数。
  • 他想要 15 秒的延迟,而不是 1 秒的延迟。
  • 不要认为他希望它从 1 到 15 数。他想迭代 adArray。
  • 这些是细节。该模式很容易调整,我想指出您的答案是我建议的全球化版本。这是重要的模式,所以如果你没有建设性的批评,请停止狙击我的回答。 :)
  • @ddlshack 给您留下了关于arguments.callee 的评论以及引用该函数的更好方法:-)
【解决方案3】:

使用此功能更容易运行:

function loopArr(arr, callback, time, infinite){
    console.log('loop run');
    var i=0,
        total=arr.length-1;
    var loop=function(){
            // RUN CODE
            console.log('loop arr['+i+']');
            callback( arr[i] );
            if (i < total ) {
                i++;
            } else { // LOOP END
                console.log('loop end!');
                if(!infinite) return;
                i=0 //restart
            }
            setTimeout( loop, time);
    }
    loop()
}

要使用此功能,请执行以下操作:

loopArr(arr, callback, time, infinite)

地点:

  • arr 是我们需要循环的数组,它可以是一个 jQuery 选择器
  • callback 是执行的函数,返回一个参数,即所选项目
  • time 是延迟所需的超时时间
  • infinite 设置为 truefalse 如果我们需要代码永远重复自己

示例使用animate.css

var imgShowHide = function(elm){
    var elm = $(elm); // select the item arr[i] via jQuery
    elm.css('animation-duration','2s').show()
        .addClass('animated bounceInRight')
        .one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){
            elm.removeClass('animated bounceInRight')
                .addClass('animated bounceInLeft')
                .one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){
                    elm.removeClass('animated bounceInLeft').hide()
                })
        });
}

// RUN
loopArr( $('#images > img'), imgShowHide, 4000, true);

【讨论】:

    猜你喜欢
    • 2014-11-10
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多