set и clearInterval

У меня есть две функции: увеличение скорости и уменьшение скорости. Оба они используют clearInterval (), затем setInterval, но что-то не так.

Уменьшение скорости замедляет мою скорость с 1000 до 5000, однако, если я использую эту функцию в 10-20 раз, скорость будет больше похожа на 100-500 мс. Также, если я использую Увеличить скорость для увеличения скорости до 50 мс и использую уменьшение скорости после, уменьшение скорости вообще не будет иметь никакого эффекта.

Это заданная, ясная функция

var updateRate = 1000;
var id = setInterval(myFunction, updateRate);
function myFunction() {     
valClickedFun(1);
   }

и уменьшить скорость

    function decreaseSpeed(){

        clearInterval(id);
        updateRate = 5000;
        setInterval(myFunction, updateRate);

        console.log(updateRate)
};

Я настроил JSFiddle, если вы нажмете кнопку «Уменьшить скорость» несколько раз, вы понимаю о чем я.


person OverflowAuto    schedule 09.04.2016    source источник
comment
вы бы не заметили увеличения / уменьшения на 50 мс, не так ли?   -  person omarjmh    schedule 09.04.2016
comment
Нет, поэтому я установил для параметра IncreaseSpeed ​​значение 50 мс (на самом деле он не увеличивается, просто устанавливает его на 50 мс), а для уменьшенияSpeed ​​значение 5000 мс. Устанавливая его на 5000 мс снова и снова, вы можете видеть, что время больше похоже на 500 мс или меньше, как если бы функция дублировала себя ... Я не знаю, как объяснить: P   -  person OverflowAuto    schedule 10.04.2016


Ответы (3)


Вы забыли назначить setInterval идентификатору в ваших функциях (уменьшение скорости и увеличение скорости).

id = setInterval(myFunction, updateRate);  

JSFiddle

person exexe    schedule 09.04.2016

Я взглянул на вашу скрипку и думаю, что нашел проблему.

Когда вы используете функции increaseSpeed и decreaseSpeed, вам необходимо установить id интервала на новый интервал. Это гарантирует, что в следующий раз, когда вы нажмете кнопку увеличения или уменьшения скорости, предыдущий интервал будет очищен.

Пример: id = setInterval(myFunction, updateRate);

person Ricardo Morgado    schedule 09.04.2016

Каждый вызов setInterval возвращает уникальное значение. Вы сохраняете это значение в id при первоначальном вызове setInterval, но не сбрасываете его ни в decreaseSpeed, ни в increaseSpeed при создании новых интервалов.

По этой причине каждый clearInterval(id) вызов пытается очистить исходный интервал, даже если он уже был очищен. Любые впоследствии созданные интервалы остаются включенными. Вместо замены существующего интервала более быстрым или медленным, increaseSpeed и decreaseSpeed добавляют новый интервал, который выполняется вместе с существующими.

Изменение

setInterval(myFunction, updateRate);

to

id = setInterval(myFunction, updateRate);

должен это исправить.

person andyk    schedule 09.04.2016