Попытка преобразовать интервал $ с глобальными переменными в функцию - PullRequest
1 голос
/ 18 июня 2019

У меня есть код, который я хочу повторить несколько раз с разными атрибутами.

Я использую $ interval из AngularJS и не могу преобразовать кусок кода в функцию.Ниже я опубликую оба кода, код без функции и код, который я пробовал с функцией, но выдает ошибку.

Оригинальный код

$scope.alarm.times.armed_away.pending_time = null;
var pendingTime;
var promiseAlarmPendingTime;

$scope.alarm.times.armed_away.pending_time = entity.attributes.armed_away_pending_time;

promiseAlarmPendingTime = $interval(function(){
   if($scope.alarm.times.armed_away.pending_time >= 0) {
      $scope.alarm.times.armed_away.pending_time -= 1;
      if($scope.alarm.times.armed_away.pending_time > 10) {
         playSound('audio/alarm_pending_time_1.mp3');
      } else if($scope.alarm.times.armed_away.pending_time > 0) {
         playSound('audio/alarm_pending_time_2.mp3');
      } else if($scope.alarm.times.armed_away.pending_time == 0){
         $interval.cancel(promiseAlarmPendingTime);
      }
   } else {
      $scope.alarm.times.armed_away.pending_time = null;
      $interval.cancel(promiseAlarmPendingTime);
      promiseAlarmPendingTime = null;
   }
}, 1000);

Моя попытка заставить его работать с функцией

promiseAlarmPendingTime = $interval($scope.fnAlarmPendingTime(
   $scope.alarm.times.armed_away.pending_time,
   promiseAlarmPendingTime), 1000);

$scope.fnAlarmPendingTime = function(pendTime, promise){
   if(pendTime >= 0) {
      pendTime -= 1;
      if(pendTime > 10) {
         playSound('audio/alarm_pending_time_1.mp3');
      } else if(pendTime > 0) {
         playSound('audio/alarm_pending_time_2.mp3');
      } else if(pendTime == 0){
         $interval.cancel(promiseAlarmPendingTime);
      }
   } else {
      pendTime = null;
      $interval.cancel(promise);
      promise = null;
   }
};

функция повторяется 1 раз, а затем выдает ошибку:

TypeError: f is not a function

Я также попытался удалить весь код внутри функции, но возникает та же ошибка.Может быть, какая-то проблема с синтаксисом?

1 Ответ

2 голосов
/ 18 июня 2019

У вас есть пара вариантов:

1) Вызовите функцию, которая вызывает вашу функцию и передает параметры.
2) передать параметры на ваш $interval вызов.

$interval имеет следующую подпись: $interval(function, delay, [count], [invokeApply], [parameters]). Вы уже знаете, что function и delay - count, если задано положительное ненулевое число, это количество раз, которое интервал должен выполняться. invokeApply обернет (или нет) function в $scope.$apply(), так что вы сможете контролировать грязную проверку модели, что и вызывает обновление представления. Наконец, parameters - это параметры, которые вы хотите передать своей функции.

Пример 1

angular.module('app', [])
  .controller('ctrl', function($interval, $scope) {
    $scope.counter = 0;
    let promise = $interval(() => incrementCounter(promise), 1000);

    function incrementCounter(promise) {
      $scope.counter++;
      if ($scope.counter == 10) {
        $interval.cancel(promise);
      }
    }
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<div ng-app="app" ng-controller="ctrl">
  Counter: {{ counter }}
</div>

Пример 2

angular.module('app', [])
  .controller('ctrl', function($interval, $scope) {
    $scope.counter = 0;
    let promise = null; // promise needs to be initialized before you can pass it as a parameter using this method
    promise = $interval(incrementCounter, 1000, 0, true, promise);

    function incrementCounter() {
      $scope.counter++;
      if ($scope.counter == 10) {
        $interval.cancel(promise);
      }
    }
  });
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<div ng-app="app" ng-controller="ctrl">
  Counter: {{ counter }}
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...