Является ли угловой интервал вызова метода сразу после создания обещания

0

У меня есть эта часть кода

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 секунды или что-то подобное. Насколько мне известно, интервал выполняет не всю повторяющуюся функцию, как только она инициализируется, но в первый раз ждет соответствующий интервал. Я ошибаюсь? В чем может быть проблема?

  • 3
    Remove () в $interval($scope.inc(), 300); , USE $interval($scope.inc, 300); Удаление скобок передаст ссылку на функцию вместо ее вызова.
  • 0
    Спасибо, @Tushar. Я пропустил потребность в ссылках. Теперь это работает, хотя, если я буду держать его нажатым, а затем разжимать, оно не перестанет расти, но это еще одна проблема. я посмотрю
Показать ещё 1 комментарий
Теги:
setinterval

1 ответ

1

Вы вызываете функцию дважды каждый раз.

$scope.inc(); //function called
promise = $interval($scope.inc(), 300); //call it again 300 ms later in the promise;

Кроме того, правильное использование интервала (ссылка, время), но вы отправляете всю функцию с помощью $ scope.inc(). Чтобы передать функцию по ссылке, вы исключаете(), как сказал Тушар. Как бы то ни было, причина в том, что функция вызывается дважды. Вы закодировали это так.

Назад с таймаутом и интервалом. Тайм-аут - один раз, интервал - каждый интервал. 'setInterval' против 'setTimeout'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню