我正在尝试使用$ 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
答案 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中简化了这一点。以下视频显示了如何使用它。