Làm thế nào để xóa hoặc dừng timeInterval trong anglejs?


91

Tôi đang tạo bản demo trong đó tôi đang tìm nạp dữ liệu từ máy chủ sau những khoảng thời gian sử dụng thường xuyên. $intervalBây giờ tôi cần dừng / hủy việc này.

Làm thế nào tôi có thể đạt được điều này? Nếu tôi cần khởi động lại quá trình, tôi nên làm như thế nào?

Thứ hai, tôi có một câu hỏi nữa: Tôi đang tìm nạp dữ liệu từ máy chủ sau những khoảng thời gian theo quy định. Có nhu cầu sử dụng $scope.applyhay $scope.watchkhông?

Đây là plunker của tôi:

  app.controller('departureContrl',function($scope,test, $interval){
   setData();

   $interval(setData, 1000*30);

   function setData(){
      $scope.loading=true;
    test.stationDashBoard(function(data){
        console.log(data);
        $scope.data=data.data;
        $scope.loading=false;
        //alert(data);
    },function(error){
        alert('error')
    }) ;

   }
});

http://plnkr.co/edit/ly43m5?p=preview

Câu trả lời:


158

Bạn có thể lưu trữ lời hứa được trả về theo khoảng thời gian và sử dụng $interval.cancel()cho lời hứa đó, điều này sẽ hủy khoảng thời gian của lời hứa đó. Để ủy quyền việc bắt đầu và dừng khoảng thời gian, bạn có thể tạo start()stop()hoạt động bất cứ khi nào bạn muốn dừng và bắt đầu lại từ một sự kiện cụ thể. Tôi đã tạo một đoạn mã dưới đây cho thấy những điều cơ bản về bắt đầu và dừng một khoảng thời gian, bằng cách triển khai nó trong chế độ xem thông qua việc sử dụng các sự kiện (ví dụ ng-click) và trong bộ điều khiển.

angular.module('app', [])

  .controller('ItemController', function($scope, $interval) {
  
    // store the interval promise in this variable
    var promise;
  
    // simulated items array
    $scope.items = [];
    
    // starts the interval
    $scope.start = function() {
      // stops any running interval to avoid two intervals running at the same time
      $scope.stop(); 
      
      // store the interval promise
      promise = $interval(setRandomizedCollection, 1000);
    };
  
    // stops the interval
    $scope.stop = function() {
      $interval.cancel(promise);
    };
  
    // starting the interval by default
    $scope.start();
 
    // stops the interval when the scope is destroyed,
    // this usually happens when a route is changed and 
    // the ItemsController $scope gets destroyed. The
    // destruction of the ItemsController scope does not
    // guarantee the stopping of any intervals, you must
    // be responsible for stopping it when the scope is
    // is destroyed.
    $scope.$on('$destroy', function() {
      $scope.stop();
    });
            
    function setRandomizedCollection() {
      // items to randomize 1 - 11
      var randomItems = parseInt(Math.random() * 10 + 1); 
        
      // empties the items array
      $scope.items.length = 0; 
      
      // loop through random N times
      while(randomItems--) {
        
        // push random number from 1 - 10000 to $scope.items
        $scope.items.push(parseInt(Math.random() * 10000 + 1)); 
      }
    }
  
  });
<div ng-app="app" ng-controller="ItemController">
  
  <!-- Event trigger to start the interval -->
  <button type="button" ng-click="start()">Start Interval</button>
  
  <!-- Event trigger to stop the interval -->
  <button type="button" ng-click="stop()">Stop Interval</button>
  
  <!-- display all the random items -->
  <ul>
    <li ng-repeat="item in items track by $index" ng-bind="item"></li>
  </ul>
  <!-- end of display -->
</div>

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>


@thanks trả lời ..is có bất kỳ cần phải thêm áp dụng hoặc xem khi tôi đang lấy dữ liệu từ dịch vụ khoảng reqular thời gian
user944513

Không, bạn không cần sử dụng apply(), nếu bạn đang sử dụng $intervaldịch vụ, vì nó làm điều đó cho bạn. Nhưng nếu bạn đang sử dụng cài sẵn setInterval()thì bạn có thể phải sử dụng $scope.$apply().
ryeballar

Giải pháp rất tốt. Các $destroyhoạt động tốt cùng với những thứ http-auth-interceptortương tự trong trường hợp của tôi, nơi tôi muốn dừng khoảng thời gian trong quá trình xác thực không thành công (như phiên hết hạn) và bắt đầu lại sau khi xác thực thành công. Cảm ơn bạn cho giải pháp tuyệt vời này.
Neel

37
var interval = $interval(function() {
  console.log('say hello');
}, 1000);

$interval.cancel(interval);

9
var promise = $interval(function(){
    if($location.path() == '/landing'){
        $rootScope.$emit('testData',"test");
        $interval.cancel(promise);
    }
},2000);

Vì URL có thể thay đổi trong tương lai nên tôi sẽ suy nghĩ kỹ trước khi sử dụng $location.path()chứ không phải tên tiểu bang
Hoặc Duan

1
    $scope.toggleRightDelayed = function(){
        var myInterval = $interval(function(){
            $scope.toggleRight();
        },1000,1)
        .then(function(){
            $interval.cancel(myInterval);
        });
    };

1

Khi bạn muốn tạo lời hứa lưu trữ khoảng thời gian cho biến:

var p = $interval(function() { ... },1000);

Và khi bạn muốn dừng / xóa khoảng thời gian chỉ cần sử dụng:

$interval.cancel(p);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.