需要一种更有效的方法来清除无资源的setInterval()id' s

时间:2017-08-15 01:32:07

标签: javascript setinterval clearinterval

我最近遇到的情况是我必须创建然后清除一组setInterval()方法:

let intervals = []

for(let i=0; i<10; i++){
  intervals.push( setInterval( function(){}, 1000 ) )
}

for(let i=0; i<10; i++){
  clearInterval( intervals[i] )
}

但无论出于何种原因,这并不总是奏效。然后我遇到了这个:

for (let i=1; i<9999; i++){
  window.clearInterval(i)
}

效果很好,但为什么我必须使用这种威胁 hack 的性能来清除一堆间隔?我注意到在记录间隔ID时我得到了这个:

function makeIntervals(){

  let intervals = []

  for(let i=0; i<10; i++){
    intervals.push( setInterval( function(){}, 1000 ) )
  }

  console.log( 'interval id\'s: ' + intervals )

  for(let i=0; i<10; i++){
    clearInterval( intervals[i] )
  }

}

makeIntervals() // interval id's: 5,6,7,8,9,10,11,12,13,14
makeIntervals() // interval id's: 15,16,17,18,19,20,21,22,23,24
makeIntervals() // interval id's: 25,26,27,28,29,30,31,32,33,34

您可以看到,即使旧间隔已清除,新的间隔ID仍会递增并分配给每个新的setInterval()

即使先前的ID已被清除,是否有充分的理由创建新的递增间隔ID?

为什么不把旧的id重新扔回池中,这样我只需要循环10次,而不是循环10次?

需要一种更有效的方法来清除无资源的setInterval()id!#/ p>

干杯。

编辑:我之所以如此坚持这一切是因为我使用递归函数来创建新的setInterval()并清除旧的那些。迟早9999+的clearInterval()循环是不够的。

1 个答案:

答案 0 :(得分:-1)

我认为你感到困惑的地方在于认为clearIntervals(interval[i])正在从i数组中删除元素intervals,而不是array.splice数组。清除间隔后,没有理由存储对它的引用,因此您应该使用for (let i = 0; i < 10; i++){ clearInterval(intervals[i]); intervals.splice(i, 1); // remove element from array } 将其从数组中删除:

Array.length

现在,当您再次调用该函数时,数组中不再存在先前的元素,因此它将从0开始。

此外,如果您想循环整个数组,而不是假设数组长度为10,则应使用for (let i = 0; i < intervals.length; i++){ clearInterval(intervals[i]); intervals.splice(i, 1); }

<?php
namespace App\Http\Controllers;
class ModulesController
{
    private $modules = [ ['name' => 'someFunction','maxNumber' => 50] ];
    public function checkFunctions($strings = NULL)
    {
     $moduleArrayId = array_search($strings ,array_column($this->modules, 'name');
     if($moduleArrayId !== FALSE)
         $this->$modules[$moduleArrayId]['name'];

    }

    public  function someFunction()
    {
       return "it works";
    }
}