2013-10-03 67 views
3

我想在我的應用程序中使用$ http編寫一個長輪詢的angularJS服務。寫一個angularJS輪詢器

這裏是我的代碼:

app.factory('Poller', function($http, $timeout){ 
    var poll = function(http, tick){ 
     http.then(function(r){ 
      $timeout(poll, tick); 
      return r.data; 
     }); 
    }; 

    return{ 
     poll: poll 
    }; 
}); 

的基本想法是,每當我需要在$ HTTP調用輪詢注入這項服務。這裏

TypeError: Cannot call method 'then' of undefined 

回答

6

即使我不懂設計(設計開銷IMO) 是:我使用它一個控制器內:

app.controller('myCtrl', function($scope, $http, Poller){ 
    $scope.polledVar = Poller.poll($http.get('api/getVar'), 1000); 
}); 

使用此代碼時,我得到以下錯誤它:

app.factory('Poller', function($http, $timeout,$q){ 
       var poll = function(http, tick){ 
        return http.then(function(r){ 
         var deferred = $q.defer(); 
         $timeout(function(){ 
          deferred.resolve(r); 
         }, tick); 
         return deferred.promise; 
        }); 
       }; 

       return{ 
        poll: poll 
       }; 
      }); 

你可以簡單地傳遞像Poller.poll('api/getVar',1000)的網址;

UPDATE

只是爲了玩:) 及以下https://stackoverflow.com/a/16520050/356380

var app = angular.module('myModule', []); 

      app.factory('Poller', function($http,$q){ 
       return { 
        poll : function(api){ 
         var deferred = $q.defer(); 
         $http.get(api).then(function (response) { 
           deferred.resolve(response.data); 
         }); 
         return deferred.promise; 
        } 

       } 
      }); 
      app.controller('myCtrl', function($scope, $http,$filter ,Poller){ 
       //Just to start 
       $scope.myts = Poller.poll('mytest.php'); 
       $scope.mydate = $scope.myts.then(function(data){ 
        return $filter('date')(data,'yyyy-MM-dd HH:mm:ss Z'); 
       }); 
       var Repeater = function() { 
        $scope.$apply(function() { 
         $scope.myts = Poller.poll('mytest.php'); 
         $scope.mydate = $scope.myts.then(function(data){ 
          return $filter('date')(data,'yyyy-MM-dd HH:mm:ss Z'); 
         }); 
        }); 
       }; 
       var timer = setInterval(Repeater, 1000);    
      }); 

mytest.php

echo time()*1000; 
+0

會不會有通過的$ scope.polledVar的輪詢,以便更新它的每個刻度的方法嗎? – Lukmo

+0

你的意思是像setInterval? http://stackoverflow.com/questions/14237070/using-setinterval-in-angularjs-factory – Whisher

+0

問題是從服務的數據傳遞到控制器的$範圍,但我用$ rootScope來代替。 – Lukmo