कैसे साफ करें या समय को रोकें?


91

मैं एक डेमो बना रहा हूं जिसमें मैं समय का नियमित अंतराल के बाद सर्वर से डेटा प्राप्त कर $intervalरहा हूं अब मुझे इसे रोकने / रद्द करने की आवश्यकता है।

मैं इसे कैसे प्राप्त कर सकता हूं? अगर मुझे प्रक्रिया को पुनः आरंभ करने की आवश्यकता है, तो मुझे यह कैसे करना चाहिए?

दूसरे, मेरे पास एक और सवाल है: मैं समय के पुनः अंतराल के बाद सर्वर से डेटा ला रहा हूं। क्या उपयोग करने की कोई आवश्यकता है $scope.applyया $scope.watch?

यहाँ मेरा प्लंकर है:

  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

जवाबों:


158

आप अंतराल को लौटाए गए वादे को संग्रहीत कर सकते हैं और $interval.cancel()उस वादे का उपयोग कर सकते हैं, जो उस वादे के अंतराल को रद्द कर देता है। अंतराल की शुरुआत और ठहराव को सौंपने के लिए, आप जब चाहें रोक सकते हैं start()और stop()कार्य कर सकते हैं और एक विशिष्ट घटना से उन्हें फिर से शुरू कर सकते हैं । मैंने घटनाओं के उपयोग (उदाहरण के लिए ng-click) और नियंत्रक में इसे लागू करके, अंतराल को शुरू करने और रोकने की मूल बातें दिखाने के लिए नीचे एक स्निपेट बनाया है ।

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>


उत्तर के लिए @ धन्यवाद .. क्या मुझे समय के
सर्विस रेक्यूलर

नहीं apply(), आपको $intervalसेवा का उपयोग करने की आवश्यकता नहीं है , यदि आप सेवा का उपयोग कर रहे हैं , क्योंकि यह आपके लिए है। लेकिन अगर आप बिल्ट-इन का उपयोग कर रहे हैं तो आपको उपयोग करना setInterval()पड़ सकता है $scope.$apply()
रायबेलर

बहुत अच्छा उपाय है। $destroyअच्छी तरह से साथ मिलकर काम करता http-auth-interceptorमेरे मामले में की तरह है, जहां मैं प्रमाणन विफलता (समय सीमा समाप्त सत्र की तरह) के दौरान अंतराल बंद करो और succesfull प्रमाणन के बाद फिर से शुरू करना चाहते हैं। इस उत्कृष्ट समाधान के लिए धन्यवाद।
नील


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

चूंकि URL भविष्य में बदल सकता है, इसलिए मैं $location.path()राज्य के नाम का उपयोग करने से पहले दो बार
या


1

जब आप वैरिएबल के लिए इंटरवल स्टोर वादा बनाना चाहते हैं:

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

और जब आप अंतराल को रोकना / साफ़ करना चाहते हैं तो बस उपयोग करें:

$interval.cancel(p);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.