如何在angularjs中为计时器创建单例服务?

时间:2018-05-25 05:24:53

标签: angularjs singleton intervals

我在angularjs(1.x)做一个项目。我的要求是我需要计算经过的秒数。

为此,我在我的控制器中使用$ interval服务编写了一个代码,该代码工作正常。

现在,由于这个代码被很多对象共享,所以我想把它变成单例。我们怎么能这样做?

以下是我在控制器中的代码:

scope.timeDiff = 0;
 var intervalId = $interval(function(){
           scope.timeDiff += 1000; 
        },1000);

 scope.$on('$destroy',function(){
           $interval.clear(intervalId);
 });

我试图像这样创建一个计时器服务:

angular.module('myModule').factory('customTimer', ['$interval','$rootScope',
  function ($interval,$rootScope) {
     var timerId, defaultInterval = 1000;     
     return {
       startTimer: function (timeDiff) {
        $interval(function(){
           timeDiff += 1000;
        },1000);
        return timeDiff;
       }
     };
}]);

然后我尝试在我的控制器中调用此服务,如下所示:

scope.timeDiff = customTimer.startTimer( scope.timeDiff);        
console.log( "new timediff:",scope.timeDiff );

虽然timeDiff在我的计时器服务中更新,但控制器总是得到0.可能是什么原因?

1 个答案:

答案 0 :(得分:1)

首先,角度服务和工厂已经是单身。

唯一的问题是同步问题。

它的异步调用,所以你必须通过使用回调或承诺来确保它。

在控制器中添加以下方法:

$scope.callback = function(retTime) {
  console.log( "new timediff:",retTime);
}
$scope.timeDiff = customTimer.startTimer( scope.timeDiff, $scope.callback);   

$scope.$on('$destroy',function(){
       customTimer.stopTimer();
}); 

工厂可以写成如下:

angular.module('myModule').factory('customTimer', ['$interval','$rootScope',
  function ($interval,$rootScope) {
     var timerId, defaultInterval = 1000;     
     return {
       startTimer: function (timeDiff, callback) {
        timerId = $interval(function(){
           timeDiff += 1000;
        // This if block will ensure your controller callback called after the value of time diff is updated.
           if(callback) {
              callback(timeDiff)
           }
        },1000);
        return timeDiff;
       },
       stopTimer: function () {
         $interval.cancel(timerId);
       }
     };
}]);

角度服务可以写成如下:

angular.module('myModule').service('customTimer', ['$interval','$rootScope',
  function ($interval,$rootScope) {
     var self = this;
     self.defaultInterval = 1000;     

       self.startTimer = function (timeDiff, callback) {
        self.timerId = $interval(function(){
           timeDiff += 1000;
        // This if block will ensure your controller callback called after the value of time diff is updated.
           if(callback) {
              callback(timeDiff)
           }
        },1000);
        return timeDiff;
       }
       self.stopTimer = function () {
         $interval.cancel(self.timerId);
       }

}]);