【问题标题】:How to clear two setIntervals assigned to same variable?如何清除分配给同一变量的两个 setInterval?
【发布时间】:2017-03-21 17:57:28
【问题描述】:

据我所知,我们可以 clearInterval 为:

var go = setInterval(function() {
  console.log("go");
}, 5000);

clearInterval(go);

但由于某种原因,在我的 javascript 代码中,我将相同的变量分配了两次 setInterval。现在即使我多次清除它也不会被清除。示例:

var go = setInterval(function(){
  console.log("go");
}, 1000);

var go = setInterval(function(){
  console.log("go");
}, 1000);

clearInterval(go);
clearInterval(go);

clearInterval(go);
clearInterval(go);

我的问题是:

这里发生了什么? javascript 如何处理这种情况? go 有什么问题?为什么不清除?

【问题讨论】:

  • 你不能。您已经覆盖了之前的计时器 ID。它丢失了。
  • 它不像你清除它,一旦它会指向你的第一个
  • relevant: const 会阻止您重新分配 intervalId
  • 这是一个很好的问题,为什么它有这么多反对票? stackoverflow 对初学者问题有抵抗力和仇恨吗?

标签: javascript ecmascript-6 prototype ecmascript-5


【解决方案1】:

你不能。您已经覆盖了之前的计时器 ID。丢了。

无论您多久调用一次clearInterval,只有第二个时间间隔以及当前存储在变量中的 id 才会被清除。

您将需要多个变量(或计时器的数据结构,例如数组):

var go1 = setInterval(function(){
  console.log("go 1");
}, 1000);

var go2 = setInterval(function(){
  console.log("go 2");
}, 1000);

clearInterval(go1);
clearInterval(go1); // nothing will happen
clearInterval(go2);

【讨论】:

  • 感谢您的回复。 javascript 在哪里存储go 的先前实例? javascript引擎是否将堆栈中的两个空格分配给go
  • 没有“上一个实例”。只有一个空格,当变量被写入前一个值时不再存储。
【解决方案2】:

正如在一些 cmets 中提到的,您在这里所做的是重新分配您的 go 变量。每次调用 setInterval 都会返回一个不同的 ID。一旦您重新分配了引用该值的唯一变量,之前的值就会丢失。

当涉及到唯一标识符时,最好保留一个可扩展的列表,这样您就不会丢失进程的标识符。我建议创建一个数组并将每个新 id 推送给它(使用它就像一个堆栈),这样它们都在一个地方,但仍然能够被单独引用:

var intervalIDs = []; //we would want something like this to be a global variable
//adding IDs to the array:
intervalIDs.push(window.setInterval(function(){console.log("go 1");}, 1000));
intervalIDs.push(window.setInterval(function(){console.log("go 2");}, 1000));
//now we know we can find both IDs in the future
//clearing an interval:
window.clearInterval(intervalIDs.pop()); //takes the last ID out of the array and uses it to stop that interval. this could be done in a for loop to clear every one you've set using the above method.
//OR if you happen to know the index (in the array) of a specific interval id you want to clear:
var index = /*index number*/;
window.clearInterval(intervalIDs.splice(index, 1)[0]);

关键是要确保您保持引用区间的方法(或任何其他类似的行为)。

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 2023-03-08
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多