2013-07-10 1 views
0

Я следил за отличным советом, отправленным здесь (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']; 
+0

Как выглядит ваш контроллер? Вы вводили в него 'pulseService'? – rGil

+0

Спасибо! Да, я не думаю, что у меня была проблема. Но я добавил упрощённый контроллер для ясности. – Offlein

ответ

1

Я думаю, что конкретная ошибка, вы получаете, потому что, когда вы делаете $ таймаут (thing.startPolling, 15000), startPolling является несвязанным. Таким образом, «это» внутри startPolling не определено.

Я думаю, вы могли бы просто заменить оба $ timeout-вызова $ timeout (obj.poller, ...) и избавиться от startPolling.

Или вы можете просто привязать метод, как $ timeout (вещь.poller.bind (вещь), 5000).

+0

Дэвид, я сожалею о задержке - мне пришлось обходить это, но попытаюсь проверить вашу рекомендацию на этой неделе и сообщить вам, как она прошла! – Offlein

 Смежные вопросы

  • Нет связанных вопросов^_^