3

$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
4

2 に答える 2

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); のように単純に URL を渡すことができます。

アップデート

遊んでみるだけです:)そして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;
于 2013-10-03T09:25:29.023 に答える
3

$interval は、AngularJs の 1.2 以降のバージョンでこれをかなり簡素化します。以下のビデオは、その使用方法を示しています。

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

于 2014-07-25T11:52:11.153 に答える