setTimeout
函数返回一个计时器句柄,你可以使用该句柄通过
clearTimeout
来取消对应的计时器。
例如:
function setBgPosition() {
var c = 0,
timer = 0;
var numbers = [0, -120, -240, -360, -480, -600, -720];
function run() {
Ext.get('common-spinner').setStyle('background-position', numbers[c++] + 'px 0px');
if (c >= numbers.length) {
c = 0;
}
timer = setTimeout(run, 200);
}
timer = setTimeout(run, 200);
return stop;
function stop() {
if (timer) {
clearTimeout(timer);
timer = 0;
}
}
因此,你可以这样使用:
var stop = setBgPosition();
// ...later, when you're ready to stop...
stop();
请注意,我没有让
setBgPosition
再次调用自己,而是让它将
c
设置回
0
。否则,这样做是行不通的。还要注意,我使用了
0
作为超时未挂起时的句柄值;
0
不是
setTimeout
的有效返回值,因此它是一个方便的标记。
在我看来,这也是你最好使用
setInterval
而不是
setTimeout
的(少数)地方之一。
setInterval
会重复执行。所以:
function setBgPosition() {
var c = 0;
var numbers = [0, -120, -240, -360, -480, -600, -720];
function run() {
Ext.get('common-spinner').setStyle('background-position', numbers[c++] + 'px 0px');
if (c >= numbers.length) {
c = 0;
}
}
return setInterval(run, 200);
}
这样使用:
var timer = setBgPosition()
// ...later, when you're ready to stop...
clearInterval(timer)
尽管如上所述,我想找到一种方法通过检测满足某些完成条件来使
setBgPosition
自己停止。