새 컨트롤러를 시작할 때 $timeout 중지
페이지를 업데이트하기 위해 2초마다 데이터를 폴링하고 있습니다.문제는 다른 페이지를 방문했을 때 타임아웃이 활성화되어 있다는 것입니다.새 페이지를 방문했을 때 타임아웃을 취소하려면 어떻게 해야 합니까?
function IndexCtrl($scope, $timeout, RestData) {
$scope.rd = {};
(function getRestDataFromServer() {
RestData.query(function(data){
$scope.rd = data;
$timeout(getRestDataFromServer, 2000);
});
})();
}
//편집: 해결책을 찾았는데, 좋은 해결책인지 잘 모르겠습니다.타임아웃을 $rootScope에 저장하면 다른 모든 컨트롤러에서 취소할 수 있습니다.
function IndexCtrl($scope, $rootScope, $timeout, RestData) {
$scope.rd = {};
(function getRestDataFromServer() {
RestData.query(function(data){
$scope.rd = data;
$rootScope.prom = $timeout(getRestDataFromServer, 2000);
});
})();
}
function newPageCtrl($scope, $rootScope, $timeout) {
$timeout.cancel($rootScope.prom);
}
루트가 변경될 때 브로드캐스트되는 Angular 이벤트가 몇 가지 있습니다.다음에서 들을 수 있습니다.IndexCtrl사용.$scope.$on적절한 조치를 취합니다.
$140 이벤트
var promise = $timeout(getRestDataFromServer, 2000);
...
$scope.$on('$destroy', function(){
$timeout.cancel(promise);
});
$location Change Start
var promise = $timeout(getRestDataFromServer, 2000);
...
$scope.$on('$locationChangeStart', function(){
$timeout.cancel(promise);
});
$timeout()는 약속 개체를 반환합니다.이 오브젝트는 다음에 제공할 수 있습니다.$timeout.cancel()기능을 사용하여 타임아웃을 취소합니다.
Stewie의 대답은 완벽하다.나는 단지 내가 사용하는 간단한 도우미 기능을 공유하고 싶었다.$timeout이 문제에 대해 다시 생각할 필요가 없도록 직접 작업합니다.
function setTimeout(scope, fn, delay) {
var promise = $timeout(fn, delay);
var deregister = scope.$on('$destroy', function() {
$timeout.cancel(promise);
});
promise.then(deregister, deregister);
}
이 기능을 다음 서비스에 추가했습니다.miscUtils그리고 저는 그 서비스를 주사하는 대신 주입합니다.$timeout그런 다음 30초마다 실행되는 "업데이트" 기능을 만듭니다.$scope가 파괴됩니다.
update();
function update() {
// do the actual updating here
miscUtils.setTimeout($scope, update, 30000);
}
에서 무슨 일이 일어나고 있는지 혼란스러운 사람들을 위해 편집deregister:
이 함수는 수신기를 등록합니다.$destroy이벤트, 단 타임아웃이 완료되면 타임아웃은 불필요해집니다.취소할 타임아웃은 없어집니다.scope.$on 는 호출되었을 때 그 리스너의 등록을 해제하는 함수를 반환합니다.그렇게,promise.then(deregister)는 타임아웃이 완료되는 즉시 불필요한 청취자를 청소합니다.
언급URL : https://stackoverflow.com/questions/17131807/stop-timeout-when-starting-new-controller
'programing' 카테고리의 다른 글
| Wordpress 사용자 메타 데이터베이스에 PHP 배열 저장 (0) | 2023.04.04 |
|---|---|
| 각도의 전역 변수JS (0) | 2023.04.04 |
| 다른 URL로 리디렉션하는 WordPress 페이지 만들기 (0) | 2023.04.04 |
| JavaScript Serializer.역직렬화 - 필드 이름 변경 방법 (0) | 2023.04.04 |
| "JSX 요소 유형 '...'에 구성 또는 호출 시그니처가 없습니다" 오류는 무엇을 의미합니까? (0) | 2023.04.04 |