Bagaimana cara menghapus atau menghentikan interval waktu di angularjs?

91

Saya membuat demo di mana saya mengambil data dari server setelah interval waktu yang teratur menggunakan $intervalSekarang saya harus menghentikan / membatalkan ini.

Bagaimana saya bisa mencapai ini? Jika saya perlu memulai ulang prosesnya, bagaimana cara melakukannya?

Kedua, saya punya satu pertanyaan lagi: Saya mengambil data dari server setelah interval waktu yang ditentukan. Apakah ada kebutuhan untuk menggunakan $scope.applyatau $scope.watch?

Ini plunker saya:

  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

pengguna944513
sumber

Jawaban:

158

Anda bisa menyimpan janji yang dikembalikan oleh interval dan menggunakan $interval.cancel()janji itu, yang membatalkan interval janji itu. Untuk mendelegasikan awal dan penghentian interval, Anda dapat membuat start()dan stop()berfungsi kapan pun Anda ingin menghentikan dan memulainya lagi dari peristiwa tertentu. Saya telah membuat cuplikan di bawah ini yang menunjukkan dasar-dasar memulai dan menghentikan interval, dengan menerapkannya dalam tampilan melalui penggunaan peristiwa (misalnya ng-click) dan di pengontrol.

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>

ryeballar
sumber
@thanks for reply .. adakah kebutuhan untuk menambahkan apply atau watch ketika saya mengambil data dari service reqular interval time
user944513
Tidak, Anda tidak perlu menggunakan apply(), jika Anda menggunakan $intervallayanan ini, karena layanan itu melakukannya untuk Anda. Tetapi jika Anda menggunakan built-in setInterval()maka Anda mungkin harus menggunakannya $scope.$apply().
ryeballar
Solusi yang sangat bagus. The $destroybekerja sama dengan baik dengan http-auth-interceptorseperti dalam kasus saya di mana saya ingin berhenti interval selama auth kegagalan (seperti sesi expired) dan mulai lagi setelah auth sukses. Terima kasih atas solusi yang sangat baik ini.
Neel
37
var interval = $interval(function() {
  console.log('say hello');
}, 1000);

$interval.cancel(interval);
Arun Sharma
sumber
9
var promise = $interval(function(){
    if($location.path() == '/landing'){
        $rootScope.$emit('testData',"test");
        $interval.cancel(promise);
    }
},2000);
Jijo Paulose
sumber
Karena URL mungkin berubah di masa depan, saya akan berpikir dua kali sebelum menggunakan $location.path()dan bukan nama negara
Atau Duan
1
    $scope.toggleRightDelayed = function(){
        var myInterval = $interval(function(){
            $scope.toggleRight();
        },1000,1)
        .then(function(){
            $interval.cancel(myInterval);
        });
    };
Christian Bonato
sumber
1

Saat Anda ingin membuat janji penyimpanan interval ke variabel:

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

Dan ketika Anda ingin menghentikan / menghapus interval cukup gunakan:

$interval.cancel(p);
pixparker
sumber