Страницы

Поиск по вопросам

суббота, 20 апреля 2019 г.

setInterval и задержки

День добрый, Господа! При написании скрипта столкнулся с такой проблемой: я задал переменной значение, затем я подставил эту переменную в setInterval в задержку, однако при изменении этой переменной интервал между выполнениями функции не изменялся. Возник вопрос: можно ли вообще подставить переменную как значение задержки в setInterval. Такой код есть на данный момент, передаю вам штурвал.
setInterval(ggg, 1000); var iter = 0; var pulse = 90; var time = 100; setInterval(timer, 1000); function ggg() { var aza = setInterval(ggg, 1000); setTimeout(ggg, 1000); clearInterval(aza); var aza = setInterval(ggg, 2000); }; function pulsing() { heart.style.backgroundColor = 'red'; setTimeout(back, 300); function back() { heart.style.backgroundColor = 'black'; }; }; function timer() { time--; }; Kek



Ответ

Нет, переменную как значение задержки в setInterval подставить нельзя, вот почему: setInterval выполняет код много раз через равные промежутки времени, пока он не будет остановлен вызовом clearInterval. т.е. промежуток задается один раз (при вызове setInterval).
Для того, чтобы сделать так, как вы хотите - нужно каждый раз "уничтожать" setInterval и заново создавать его, с уже новым промежутком(который есть у вас в переменной).
PS. это можно сделать разными способами, как один из возможных - при помощи Object.prototype.watch() (учитывая его не поддержку:D, можно юзать - полифилл).
var timerObj = { interval: 0, timerId: 0, func: my_function}; // объект для интервала
timerObj.watch('interval', function(prop, oldval, val) { // тут пересоздавать сам setInterval нужно: if(timerObj.timerId) clearTimeout(timerObj.timerId); timerObj.timerId = setInterval(this.func, val); });
timerObj.interval = 1000; // запустили интервал
// много кода
timerObj.interval = 5000; // в любом месте меняет, он сам пересоздается)
// можно еще придумать методы для полной остановки и т.д.
PPS. как в комментариях верно подметили - лучше использовать Object.defineProperty, тогда код выглядел бы так(полифилл не нужен):
var timerObj = {timerId: 0, func: my_function}; // объект для интервала Object.defineProperty(timerObj, 'interval', { set:function(val){ if(timerObj.timerId) clearTimeout(timerObj.timerId); timerObj.timerId = setInterval(timerObj.func, val); } });
timerObj.interval = 1000;
// много кода
timerObj.interval = 5000;

Комментариев нет:

Отправить комментарий