Я следил за отличным советом, отправленным здесь (Server polling with AngularJS), но [думаю, мне] иногда нужно отменить опрос, чтобы восстановить его позже.AngularJS продолжающийся опрос сервера с отменой
В частности, у меня есть список данных. Клиент проверяет сервер каждые 5 секунд с отметкой времени «последней синхронизации» - в последний раз, когда он был связан с сервером. Сервер отвечает за любые изменения с этой отметки времени.
Иногда клиент может внести изменение, отправив PUT на сервер.
У меня возникла проблема с запросом PUT, я думаю, вмешиваясь в опрос (или наоборот), в результате чего данные перестают синхронизироваться. Я бы хотел проверить это, отменив опрос до тех пор, пока запрос PUT не будет одобрен. Но я просто не могу добраться до места, где функция опроса может успешно вызывать себя каждый раз; выпустить обещание, которое отменено; и перезагружаться извне после его отмены.
Я немного поработал с сервисом («pulseService»), но я не могу пройти весь путь. Похоже, что это, но терпит неудачу с «не может прочитать свойство„Poller“неопределенных»:
myModule.factory('pulseService', function($http, $rootScope, $timeout) {
$rootScope.pulsePromise = null;
var obj = {
poller: function() {
var thing = this;
console.log("Here I am!");
var semaphore = new Date().getTime();
var query = {"timestamp": {'$gt': semaphore}};
query = JSON.stringify(query);
$http({method: 'GET', url: '/registrants', data: query}).
success(function(data, status, headers, config) {
$rootScope.error = false;
$rootScope.$broadcast('pollFinished', data);
$rootScope.pulsePromise = $timeout(thing.poller, 5000);
}).
error(function(data, status, headers, config) {
$rootScope.error = true;
semaphore = new Date().getTime();
$rootScope.pulsePromise = $timeout(thing.startPolling, 15000);
});
}(),
startPolling: function() {
console.log(this);
this.poller;
}
};
return obj;
});
По желанию, вот упрощенная версия моего контроллера .. Это может быть немного Kruft в нем, но я пытался упрощать из материала:
function regCtrl($scope, $http, $rootScope, $timeout, pulseService) {
// ...
// Doing stuff to initialize and gather data into $scope.attendees
$scope.$on('pollFinished', function(event, data) {
var found = false;
angular.forEach(data, function(resultVal, resultKey) {
while (found === false) {
angular.forEach($scope.attendees, function(attendeeVal, attendeeKey) {
if (attendeeVal.id == resultVal.id) {
$scope.attendees[attendeeKey] = resultVal;
found = true;
}
});
}
found = false;
});
});
// .. Logic for pushing a change to the server
// .....
$timeout.cancel($rootScope.pulsePromise);
$http({method: 'PUT', url: '/registrants/'+attendee.id, data: query }).
success(function(data, status, headers, config) {
attendee.isHere = data.isHere;
console.log("rerunning");
}).
error(function(data, status, headers, config) {
$scope.error = true;
});
// ...
var semaphore = new Date().getTime();
// Kickoff the polling process
pulseService.startPolling();
}
regCtrl.$inject = ['$scope','$http','$rootScope','$timeout','pulseService'];
Как выглядит ваш контроллер? Вы вводили в него 'pulseService'? – rGil
Спасибо! Да, я не думаю, что у меня была проблема. Но я добавил упрощённый контроллер для ясности. – Offlein