У меня есть эта часть кода
inputElem.on('keydown', function(event) {
if (event.which === 38) { // up
$scope.inc();
promise = $interval($scope.inc(), 300);
} else if (event.which === 40) { // down
$scope.dec();
promise = $interval($scope.dec(), 300);
}
});
inputElem.on('keyup', function(event) {
if (event.which === 38 || event.which === 40) {
$interval.cancel(promise);
}
});
Я в основном использую его для увеличения/уменьшения значений в окне редактирования на 1 с помощью стрелок вверх и вниз. Поэтому, когда пользователь держит стрелку вверх/вниз, значение продолжает меняться. Моя проблема заключается в том, что, похоже, это увеличивает/уменьшает значение дважды, даже если я нажимаю одну из стрелок очень быстро. Я помещаю console.log() в функции inc() и dec(), и они действительно вызываются дважды, даже если я изменяю время на 3 секунды или что-то подобное. Насколько мне известно, интервал выполняет не всю повторяющуюся функцию, как только она инициализируется, но в первый раз ждет соответствующий интервал. Я ошибаюсь? В чем может быть проблема?
Вы вызываете функцию дважды каждый раз.
$scope.inc(); //function called
promise = $interval($scope.inc(), 300); //call it again 300 ms later in the promise;
Кроме того, правильное использование интервала (ссылка, время), но вы отправляете всю функцию с помощью $ scope.inc(). Чтобы передать функцию по ссылке, вы исключаете(), как сказал Тушар. Как бы то ни было, причина в том, что функция вызывается дважды. Вы закодировали это так.
Назад с таймаутом и интервалом. Тайм-аут - один раз, интервал - каждый интервал. 'setInterval' против 'setTimeout'
()
в$interval($scope.inc(), 300);
, USE$interval($scope.inc, 300);
Удаление скобок передаст ссылку на функцию вместо ее вызова.