javascript clearInterval 不适用于数组函数

javascript clearInterval not working on array function

var intervalHandles = [];

function instanceLoopTimer(url,instance, time, id) { 
 if (id in intervalHandles) {
  clearInterval(intervalHandles[id]);
  intervalHandles[id] = 0;
 }
 intervalHandles[id] = setInterval(function() { 
  myFuction(); 
 }, time);
}

我创建了这个函数,这样它就可以自己循环,这个函数在你第一次 运行 时工作得很好,但第二次我 运行 使用相同的值时,它似乎进入了一个无限循环

我认为 clearInterval 没有被触发,所以当我重新运行它进入循环的同一个实例时,有人可以帮我吗

  1. 您应该使用和反对 var intervalHanldes = {} 使用数组时,不能使用字符串作为索引。
  2. 如果您将 prop 设置为 0,in 运算符将找到它,因此最好使用 delete

var intervalHandles = {}; // should be an object!

function instanceLoopTimer(url,instance, time, id) { 
  if (id in intervalHandles) {
    clearInterval(intervalHandles[id]);
    delete intervalHandles[id];
  }

  intervalHandles[id] = setInterval(myFuction, time);
}

您的代码确实有效。如果您第二次调用该函数,它将停止原始间隔,将其设置为 0,然后将在其位置开始一个新间隔:

演示:

var intervalHandles = [];

var myFunction = function() {
  console.log('myFunction was called, 1 second interval');
};

function instanceLoopTimer(url, instance, time, id) {
  if (id in intervalHandles) {
    clearInterval(intervalHandles[id]);
    intervalHandles[id] = 0;
  }
  intervalHandles[id] = setInterval(function() {
    myFunction();
  }, time);
}

instanceLoopTimer(null, null, 1000, 1);

setTimeout(function() {
  myFunction = function() {
    console.log('new myFunction was called, 0.5 second interval');
  };

  instanceLoopTimer(null, null, 500, 1);
}, 5000);

如果您想要第二次调用完全停止间隔而不是重新启动它,您可以在 if 语句中添加 return

演示:

var intervalHandles = [];

var myFunction = function() {
  console.log('myFunction was called, 1 second interval');
};

function instanceLoopTimer(url, instance, time, id) {
  if (id in intervalHandles) {
    clearInterval(intervalHandles[id]);
    intervalHandles[id] = 0;
    return;
  }
  intervalHandles[id] = setInterval(function() {
    myFunction();
  }, time);
}

instanceLoopTimer(null, null, 1000, 1);

setTimeout(function() {
  myFunction = function() {
    console.log('This should not be called');
  };

  instanceLoopTimer(null, null, 1000, 1);
}, 5000);

值得注意的是,如果您第三次调用它并期望间隔再次开始,它不会。这是因为您的 ID 将保留在您的 intervalHandles 数组中,除非您像这样在 return 语句上方插入 delete intervalHandles[id]

var intervalHandles = [];

var myFunction = function() {
  console.log('myFunction was called, 1 second interval');
};

function instanceLoopTimer(url, instance, time, id) {
  if (id in intervalHandles) {
    clearInterval(intervalHandles[id]);
    delete intervalHandles[id];
    return;
  }
  intervalHandles[id] = setInterval(function() {
    myFunction();
  }, time);
}

instanceLoopTimer(null, null, 1000, 1);

setTimeout(function() {
  myFunction = function() {
    console.log('This should not be called');
  };

  instanceLoopTimer(null, null, 1000, 1);
}, 5000);

setTimeout(function() {
  myFunction = function() {
    console.log('The interval is alive again!');
  };

  instanceLoopTimer(null, null, 1000, 1);
}, 10000);