Решение на основе замыкания, использующее setInterval()
и clearInterval()
:
// define a generic repeater
var repeater = function(func, times, interval) {
var ID = window.setInterval( function(times) {
return function() {
if (--times <= 0) window.clearInterval(ID);
func();
}
}(times), interval);
};
// call the repeater with a function as the argument
repeater(function() {
alert("stuff happens!");
}, 3, 60000);
РЕДАКТИРОВАТЬ: Другой способ выразить то же самое, используя setTimeout()
вместо:
var repeater = function(func, times, interval) {
window.setTimeout( function(times) {
return function() {
if (--times > 0) window.setTimeout(arguments.callee, interval);
func();
}
}(times), interval);
};
repeater(function() {
alert("stuff happens!");
}, 3, 2000);
Может быть, последнее немного легче понять.
В версии setTimeout()
вы можете гарантировать, что следующая итерация произойдет только после того, как завершит предыдущую. Вы просто переместите func()
линию выше setTimeout()
линии.