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
остановить вещи сам , обнаружив, что некоторое условие завершения было выполнено.