间隔就像会重新安排自己的超时(这与开始新超时的超时不同)。由于间隔会自行重新安排,因此只创建一个. (或者,只有真正需要的数量。)
原始帖子的问题在于它创建了5 个间隔(因为它们是在循环中创建的),然后只保留counter
创建的最后一个间隔的间隔 ID(in )!因此,clearInterval
唯一停止了最后一个间隔,其他 4 个间隔继续运行,运行和运行..
这是一些带有注释且没有原始问题的清理代码:
var count = 5;
// only need ONE interval
var counter = setInterval(timer, 1000);
// so we do one count RIGHT NOW
timer();
function timer() {
// display first, so we start at 5: 5, 4 .. 1
console.log(count);
count--;
if (count < 0) {
// to repeat the count, comment out the clearInterval
// and do `count = 5;` or similar .. take it from here :D
clearInterval(counter);
}
}
要为每个倒计时创建单独的“状态”,请创建一个新的倒计时对象来维护属性中的状态或使用闭包。这是一个带有闭包的示例。我还添加了对回调函数的支持,以展示如何使这样的函数更通用:
function makeCountdown(startCount, delay, fn) {
fn = fn || function (i) {
// default action, if fn not specified
console.log(i);
};
// local variables
var count = startCount;
var counter = setInterval(timer, delay);
timer();
function timer() {
// now count and counter refer to variables in the closure (keyword!)
// which are different each time makeCountdown is called.
fn(count);
count--;
if (count < 0) {
clearInterval(counter);
}
}
}
makeCountdown(20, 500); // uses default function
makeCountdown(10, 1000, function (i) { console.log(10 - i) });
makeCountdown(5, 2000, function (i) { console.log("SLOW! " + i) });
练习:
- 添加倒计时“完成”时的回调函数,以便可以连续运行倒计时。
- 使用一个系列生成器并使用它来生成下一个
count
值。
- 返回
makeCountdown
一个可用于控制倒计时的对象。
- 玩得开心!