programing

새 컨트롤러를 시작할 때 $timeout 중지

golfzon 2023. 4. 4. 22:40
반응형

새 컨트롤러를 시작할 때 $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

반응형