我可以在服务中使用$ interval吗?

时间:2014-06-05 04:05:33

标签: angularjs

简短版:请回复标题。谢谢你的帮助。

更长的版本:我开始了,因为我想很多n00bs都做了,用一些代码,一点一点地添加了一些,并发现自己在一个巨大的控制器中的所有东西。

所以,我拆分了我的功能并拥有一堆较小的控制器。

然后我希望他们彼此沟通。我发现了服务。

然后我读到控制器应该是精益的&意思是我开始将许多逻辑从控制器转移到服务。

现在我发现一些旧的代码,其中包括 $scope.internetConnectionRetryTimer = $interval($scope.attemptInternetConnection, RECONNECT_ATTEMPT_FREQUENCY);

当移入服务时 this.internetConnectionRetryTimer = $interval(this.attemptInternetConnection, RECONNECT_ATTEMPT_FREQUENCY); 似乎没有运行计时器;无论是或者在到期时没有调用该函数。

与短版本相同的问题:我可以在服务中实际使用$ interval吗?


[更新]这里是代码:

全局变量SERVER是一个URL并且var RECONNECT_ATTEMPT_FREQUENCY = 5 * 1000; // 5秒

   this.attemptInternetConnection = function()
   {
        $interval.cancel(this.internetConnectionRetryTimer);

        var params = '?action=test_connection&user=dummy';  

        $http.get(SERVER + params).  
            success(function() 
                {
                    $interval.cancel(this.internetConnectionRetryTimer); 
                    $rootScope.$broadcast('internetIsAvailable');
                })
               .error(function(status) 
               { 
                    this.internetConnectionRetryTimer = $interval(this.attemptInternetConnection, RECONNECT_ATTEMPT_FREQUENCY);  
                    $rootScope.$broadcast('internetIsUnavailable');
               });                         
   };// attemptInternetConnection()

2 个答案:

答案 0 :(得分:5)

没问题。 这是一个例子:

<div ng-app="myApp" ng-controller="myCtrl">{{Data.Test}}</div>

angular.module('myApp', []).
controller('myCtrl', function ($scope, myService) {
    $scope.Data = {Test: 'Test'};
    myService.ChangeTest($scope.Data);
}).
service('myService', function ($interval) {
    this.ChangeTest = function (data) {
        $interval(function () {
            if (data.Test == 'Test') data.Test = 'Changed Test';
            else data.Test = 'Test';
        },500);
    }
});

这里是Fiddle

答案 1 :(得分:1)

这应该可以正常工作。虽然这取决于方法attemptInternetConnection是如何编写的,因为代码未发布。如果您在attemptInternetConnection中引用特定于服务的任何变量,则应通过引用服务对象来访问它,如下面给出的示例。

演示:http://plnkr.co/edit/1J0qzw044WRHSFGvZyOD?p=preview

app.service('intervalTest', function($interval) {
  var me = this;
  me.comments = [{
    total: 3,
    comment: 'some comment 1'
  }, {
    total: 10,
    comment: 'some other comment'
  }];
  this.getComments = function() {
    return me.comments;
  };
  $interval(function() {
    console.log('interval executed');
    me.comments[0].total++;
  }, 1000);
});