Angularjs $ interval:使用回调函数作为函数

时间:2015-08-21 18:10:20

标签: javascript angularjs intervals

很抱歉这个令人困惑的标题,我真的不知道怎么说这个问题。我尝试使用谷歌搜索大量不同的短语,但同样的结果不断出现,这不是我正在寻找的。

首先,我是angularjs和javascript的新手,如果我想念一些非常简单的东西,那么道歉。

查看间隔文档: https://docs.angularjs.org/api/ng/service/ $间隔

我尝试做的是调用$ 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);
})();

MY-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 param类型表示" *"所以我假设它意味着支持任何类型,并且该函数是有效的参数。这不是这种情况吗?对于$ interval服务,是否不能将函数作为参数传递给fn?

- 提前谢谢你看看。

2 个答案:

答案 0 :(得分: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);

好像你正在不必要地传播你的逻辑。

答案 1 :(得分:0)

您对$timeout的使用是正确的。您对服务的定义不是。

尝试返回定义doWork方法的对象。像这样做服务定义:

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

function myService() {
    var doWork = function() {
         ...
    };
    return { doWork: doWork };
}