কীভাবে সাফ করুন বা সময় বন্ধ করুন কৌণিক জড়ায় অন্তর্বর্তী?


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= পূর্বরূপ

উত্তর:


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>


জবাবের জন্য ধন্যবাদ .. আমি যখন পরিষেবা থেকে প্রয়োজনীয় তথ্য সময়কালের মধ্যবর্তী সময়ে ডেটা আনছি তখন প্রয়োগ বা দেখার দরকার আছে
user944513

না আপনি 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);

যেহেতু ইউআরএলগুলি ভবিষ্যতে পরিবর্তিত হতে পারে আমি $location.path()রাষ্ট্রের নাম ব্যবহার করে না হয়ে দু'বার আগে
ভাবব


1

আপনি যখন ভেরিয়েবলের জন্য বিরতি স্টোর প্রতিশ্রুতি তৈরি করতে চান:

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

এবং আপনি যখন বিরতি / সাফ করতে চান কেবলমাত্র ব্যবহার করুন:

$interval.cancel(p);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.