Я считаю, что создание тайм-аутов в цикле обычно слишком сложно для управления - вам не нужно отменять несколько тайм-аутов. Лучше, чтобы функция выполняла рабочий вызов сам (косвенно), устанавливая тайм-аут непосредственно перед его завершением, потому что тогда вы можете выполнить простой тест if, чтобы решить, следует ли установить следующий тайм-аут и продолжить анимацию.
Возможно, что-то вроде этого:
<input id="playPause" type="button" value="Play">
<script>
function initAnimation(animationMs, autoRepeat, waitForPlayButton) {
var currentFrame = 0,
$imgList = $("#gallery > img"),
paused = waitForPlayButton;
function drawNext() {
clearCanvas();
cvsCtx.drawImage($imgList[currentFrame++],0,0);
if (currentFrame >= $imgList.length) {
currentFrame = 0;
if (!autoRepeat) {
paused = true;
$("playPause").prop("value", "Play");
}
}
if (!paused)
setTimeout(drawNext, animationMs);
}
$("playPause").prop("value", waitForPlayButton ? "Play" : "Pause")
.click(function() {
this.value = (paused = !paused) ? "Play" : "Pause";
if (!paused)
drawNext();
});
if (!waitForPlayButton)
drawNext();
}
initAnimation(100, true, false);
</script>
Если autoRepeat
параметр равен false, анимация будет запускаться один раз и останавливаться, но ее можно будет перезапустить с помощью кнопки, в противном случае (очевидно) она просто будет повторяться.
Если waitForPlayButton
равно false, анимация начнется немедленно, иначе (очевидно) она начнется при нажатии кнопки.
Нажатие кнопки приостановит текущий кадр.
(не тестировалось, поскольку у меня нет нескольких полезных картинок, но я уверен, что вы поняли идею и можете решить любые проблемы самостоятельно. Или дайте мне знать, если у вас появятся ошибки ...)