我试图在我的应用程序中使用$ 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 undefinedI'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;更多推荐
发布评论