我最近遇到的情况是我必须创建然后清除一组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()循环是不够的。
答案 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";
}
}