【问题标题】:javascript setInterval function inside loop not working循环内的javascript setInterval函数不起作用
【发布时间】:2016-05-25 18:05:27
【问题描述】:

我正在尝试“一次”启动多个 setInterval 函数。 我有一个 for 循环,它调用一个索引函数,其中包含 setInterval。

我在这里寻找答案: JavaScript closure inside loops – simple practical example 和这里: setInterval with loop time

但我仍在挣扎,没有成功......

我已经检查了 tab 和 tab2,如果我在 setInterval 函数之外使用 console.log 读取它们,它们都可以工作

这是我的代码:

var tab = <?php echo json_encode($matrice); ?>;
var tab2 = new Array();

var funcs = [];

var countDownAction = new Array();

function countDown(i)
{
    countDownAction[i] = setInterval(function(i)
    {
        // some actions

    }, 1000);  
}


for(var i = 0; i < tab.length; i++)
{
    tab2[i] = [];

    tab2[i]['hours'] = tab[i]['hours'];
    tab2[i]['minutes'] = tab[i]['minutes'];
    tab2[i]['seconds'] = tab[i]['seconds'];

    funcs[i] = countDown.bind(this, i);
}

for(var j = 0; j < tab.length; j++)
{
    funcs[j]();
}

【问题讨论】:

  • 您的// some actions 是否依赖于变量i
  • 是的,这些动作取决于变量 i
  • 您将一个函数传递给setinterval,该函数接受一个参数i,但setInterval 没有向其回调传递任何参数,因此i 将是未定义的。
  • 试试setInterval(function () ...
  • 但我还在挣扎,没有成功……” 在你眼中定义成功。假设会发生什么与当前(未)发生什么?

标签: javascript loops setinterval


【解决方案1】:

setInterval 中的函数在没有任何参数的情况下被调用。因此,函数体内的i 将是未定义的。

考虑重写countDown函数如下:

function countDown(i)
{
    countDownAction[i] = setInterval(function()
    {
        // some actions

    }, 1000);  
}

这样,函数体就可以在外部范围内访问i

要清除计时器,比如 3.5 秒后,您可以执行以下操作:

setTimeout(function () {
    for (var k = 0; k < tab.length; k++) {
        clearInterval(countDownAction[k]);
    }
}, 3500);

【讨论】:

  • 这听起来可能很愚蠢,但我无法使用与调用那些 setInterval 函数相同的函数来清除这些倍数 setInterval...
【解决方案2】:

我建议你对 countDownAction 使用全局变量,你可以试试下面的。

window.countDownAction = window.countDownAction || [];

【讨论】:

    【解决方案3】:

    问题是循环太快了,所以 setInterval 函数得到了 i 变量的最后一个值。 我们需要使用这样的外部函数直接在区间中设置 i 值:

    var interval_Array = new Array();
    
    for(var i; i<= number ;i++){
        var newinterval = (i+1) * 1000; //Place any process according to your time
        external_function(i,newinterval);
    };
    
    function external_function(this_i,this_interval){
        interval_Array[i]=setInterval(function(){
          //your script that contains i variable
        },this_interval);
    };
    

    【讨论】:

      猜你喜欢
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      相关资源
      最近更新 更多