编写angularJS轮询器

时间:2013-10-03 09:03:51

标签: angularjs long-polling

我正在尝试使用$ http为我的应用程序编写一个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呼叫上进行轮询时注入此服务。我在控制器中使用它:

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

使用此代码时出现以下错误:

TypeError: Cannot call method 'then' of undefined

2 个答案:

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

你可以直接传递像Poller.poll这样的网址('api / getVar',1000);

<强>更新

只是为了玩:) 并关注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;

答案 1 :(得分:3)

$ interval在1.2版本的AngularJs中简化了这一点。以下视频显示了如何使用它。

https://www.youtube.com/watch?v=jFxPFgGaEqk