Angularjs $ интервал: использование функции обратного вызова в качестве параметра для передачи в функцию

0

Извините за запутанный титул, я действительно не понимаю, как сформулировать этот вопрос. Я пробовал погулять тонну разных фраз, но те же результаты продолжаются, и это не то, что я ищу.

Во-первых, я новичок в angularjs и javascript, так что извиняюсь, если пропущу что-то довольно простое.

Рассматривая интервальную документацию: https://docs.angularjs.org/api/ng/service/ $ interval

То, что я пытаюсь сделать, это вызвать услугу $ interval, например:

controller.js:

(function() {
    function controller($scope, $interval, myService) {

        var stop;
        function handleCallback( myParams ) {
            //do stuff with myParams
            //call stopInterval function if neccessary.
        }

        $scope.doSomething = function() {
            stop = $interval(myService.doWork, 5000, 0, handleCallback);
        };


        var stopInterval = function() {
            if (angular.isDefined( stop ) ) {
                $interval.cancel( stop );
                stop = undefined;
            };
        };
    }

    angular.module( 'myApp' ).controller( 'controller', controller);
})();

мой-service.js

(function() {
    function myService($q, $http) {
        myService.doWork = function( callback ) {
            var dfd = $q.defer();
            $http.get('url').success( function( response ) {
                //Would parse the response into an appropriate response
                //before calling the callback method with it.
                callback( response );
                dfd.resolve( response );
            }).error( function( response ) ) {
                //will add an error callback once I get this working
                dfd.reject( response );
            });

            return dfd.promise;
        }

        return myService
    }

    angular.module( 'myApp' ).factory( 'myService', myService);
})();

Когда я перехожу к этому, и я запускаю метод myService.doWork (обратный вызов), обратный вызов никогда не является функцией, а просто числом и каждый раз, когда он попадает, число увеличивается на единицу.

Я не уверен, откуда это число, но я предполагаю, что я неправильно настраиваю вызов $ interval. Глядя на угловую документацию, тип параметра Pass указывает "*", поэтому я предполагаю, что это означает, что поддерживается любой тип и что функции являются действительными параметрами. Разве это не так? Невозможно ли передать функцию в качестве параметра в fn для услуги $ interval?

-Thanks заранее, чтобы посмотреть.

Теги:
intervals

2 ответа

1
Лучший ответ

Вы возвращаете обещание со своего сервиса. Какую конкретную причину вы бы не делали:

var stop = $interval(function () { 
  myService
   .doWork()
   .then(function (res) {
     //if promise is successful, res is your data
     $interval.cancel(stop)
   })
   .catch(function (err) {
     //if promise was rejected, err is your servers error message
   });
}, 5000);

Похоже, вы распространяете свою логику без необходимости.

  • 0
    Спасибо за это предложение. Я даже не думал о таком подходе, и реализация моей логики таким образом определенно делает мой код намного чище и проще. Я обновил свой код, и он прекрасно работает, но мне все еще любопытно, почему мой пример кода не работает. Мой метод возвращает обещание, но я не понимаю, почему это влияет на параметр params, который я передаю. Для функции params не должно иметь значения тип возвращаемого значения, верно?
  • 0
    В документации angularjs есть 5 параметров для интервала: $ interval (fn, delay, [count], [invokeApply], [Pass]); Кажется, вы отправляете только 4 параметра. Если я помог, пожалуйста, проголосуйте и отметьте как правильный ответ :)
0

Ваше использование $timeout верное. Ваше определение услуги не является.

Попробуйте вернуть объект, в котором вы определяете свой метод doWork. Сделайте определение службы следующим образом:

angular.module( 'myApp' ).factory( 'myService', myService);

function myService() {
    var doWork = function() {
         ...
    };
    return { doWork: doWork };
}
  • 0
    Вы правы, в моем реальном коде я делаю нечто подобное. Я обновил свой пост, чтобы отразить, что делает мой настоящий код. Извиняюсь за упущение этой важной детали.

Ещё вопросы

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