编写一个angularJS轮询器(Writing an angularJS poller)

我试图在我的应用程序中使用$ 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

I'm trying to write an angularJS service for long polling in my application, using $http.

Here's my code :

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

The basic idea would be to inject this service whenever I need polling on a $http call. I'm using it inside a controller :

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

When using this code I get the following error :

TypeError: Cannot call method 'then' of undefined

最满意答案

即使我不了解设计(架空设计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这样的url('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;

Even if I don't understand the design (overhead design imo) here is it:

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

You could simply pass the url like Poller.poll('api/getVar', 1000);

UPDATE

just to play around :) and following 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;编写一个angularJS轮询器(Writing an angularJS poller)

我试图在我的应用程序中使用$ 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

I'm trying to write an angularJS service for long polling in my application, using $http.

Here's my code :

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

The basic idea would be to inject this service whenever I need polling on a $http call. I'm using it inside a controller :

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

When using this code I get the following error :

TypeError: Cannot call method 'then' of undefined

最满意答案

即使我不了解设计(架空设计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这样的url('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;

Even if I don't understand the design (overhead design imo) here is it:

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

You could simply pass the url like Poller.poll('api/getVar', 1000);

UPDATE

just to play around :) and following 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;