2013-10-03 4 views
3

Я пытаюсь написать услугу angularJS для длительного опроса в моем приложении, используя $ http.Письмо angularJS poller

Вот мой код:

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 вызова. Я использую его внутри контроллера:

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

При использовании этого кода я получаю следующее сообщение об ошибке:

TypeError: Cannot call method 'then' of undefined 

ответ

6

Даже если я не понимаю, дизайн (верхний дизайн IMO) здесь это:

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 
       }; 
      }); 

Вы могли бы просто передать URL как Poller.poll ('апи/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 к Poller так, чтобы она обновляет его каждый клещ? – Lukmo

+0

вы имеете в виду, как setInterval? http://stackoverflow.com/questions/14237070/using-setinterval-in-angularjs-factory – Whisher

+0

Проблема заключалась в передаче данных из службы в $ scope контроллера, но вместо этого я использовал $ rootScope. – Lukmo

Смежные вопросы