कोणीय 2 में टाइमर कैसे बनाएं


95

मुझे Angular 2 में एक टाइमर की आवश्यकता है, जो एक समय अंतराल के बाद टिक जाता है और कुछ कार्य करता है (कुछ कार्यों को कॉल किया जा सकता है)।

यह कोणीय 2 के साथ कैसे करें?


2
दूसरों को समस्या को पुन: उत्पन्न करने की अनुमति देने के लिए बस पर्याप्त कोड शामिल करें। इसकी मदद के लिए, न्यूनतम, पूर्ण और सत्यापन योग्य उदाहरण कैसे बनाएं पढ़ें। यदि यह समस्या का एक जीवित उदाहरण बनाना संभव है जिसे आप (उदाहरण के लिए, sqlfiddle.com या jsbin.com पर ) लिंक कर सकते हैं तो ऐसा करें - लेकिन अपने प्रश्न में कोड भी शामिल करें। हर कोई बाहरी साइटों तक नहीं पहुंच सकता है, और लिंक समय के साथ टूट सकते हैं।
प्रसाद

15
यह वास्तव में एक बहुत ही उपयोगी प्रश्न है। वेधशालाएँ सीखना और उपयोग करना महत्वपूर्ण हैं। भले ही उपयोगकर्ता के पास इस प्रश्न से जाने के लिए कोड न हो, दूसरों के लिए उपयोगी होगा।
विनीमुक्का

यह टिप्पणी उसी बाल्टी में आती है, लेकिन पिछले 2 लोगों में से किसी ने भी मदद नहीं की है, बस सवाल पर टिप्पणी की है ... जाहिर है कि लोग अब फिर से सेटआउट का उपयोग कर रहे हैं।
rbnzdave

सेटटाइमआउट वास्तव में पुराना स्कूल है - नीचे दिए गए ताजा टाइमर को चेकआउट करें
फिलिप

2
let._timer = setInterval (() => this.getWidgetData (), 10000); और स्पष्ट करना सुनिश्चित करें Interval (यह। timer); नष्ट होने पर
crh225

जवाबों:


129

पिछले सभी उत्तरों के अलावा, मैं इसे RxJS वेधशालाओं का उपयोग करके करूंगा

कृपया Observable.timer की जाँच करें

यहाँ एक नमूना कोड है, 2 सेकंड के बाद शुरू होगा और फिर हर सेकंड टिक जाएगा:

import {Component} from 'angular2/core';
import {Observable} from 'rxjs/Rx';

@Component({
    selector: 'my-app',
    template: 'Ticks (every second) : {{ticks}}'
})
export class AppComponent {
  ticks =0;
  ngOnInit(){
    let timer = Observable.timer(2000,1000);
    timer.subscribe(t=>this.ticks = t);
  }
}

और यहां एक काम करने वाला प्लंकर है

अद्यतन यदि आप AppComponent वर्ग पर घोषित एक फ़ंक्शन को कॉल करना चाहते हैं, तो आप निम्न में से एक कर सकते हैं:

** जिस फ़ंक्शन को आप कॉल करना चाहते हैं , उसे फेक नाम दिया गया है ,

ngOnInit(){
    let timer = Observable.timer(2000,1000);
    timer.subscribe(this.func);
}

उपर्युक्त दृष्टिकोण के साथ समस्या यह है कि यदि आप इसे 'फंक' के अंदर 'कॉल' करते हैं, तो यह AppComponent ऑब्जेक्ट के बजाय सब्स्क्राइबर ऑब्जेक्ट को संदर्भित करेगा, जो संभवतः वह नहीं है जो आप चाहते हैं।

हालाँकि, नीचे दिए गए दृष्टिकोण में, आप एक लैम्ब्डा एक्सप्रेशन बनाते हैं और उसके अंदर फ़ंक्शन फंक कहते हैं । इस तरह, फेक कॉल अब भी AppComponent के दायरे में है। मेरी राय में इसे करने का यह सबसे अच्छा तरीका है।

ngOnInit(){
    let timer = Observable.timer(2000,1000);
    timer.subscribe(t=> {
        this.func(t);
    });
}

वर्किंग कोड के लिए इस प्लंकर की जाँच करें


क्या मुझे `टाइमर.subscribe (t => this.ticks = t);` जो हर टिक में कॉल है?
कुंतल

@matrixwebtech जी हाँ, 't => this.ticks = t' एक लंबोदर अभिव्यक्ति है, बिल्कुल 'फ़ंक्शन (t) {this.ticks = t}' के समान है
अब्दुलरहमान अलसोघेयेर

मैं टाइमर की कोशिश करता हूं। सदस्यता समाप्त करें (फ़ंक्शन नाम () {कंसोल.लॉग ("hhhhhh")}); जो काम कर रहा है लेकिन मैं एक फ़ंक्शन को कैसे कॉल करता हूं जो अलग से घोषित किया गया है () {let टाइमर = Observable.timer (2000,1000); टाइमर। सदस्यता (फ़ंक्शन () {this.fun ();}); } मस्ती () {
कंसोल.लॉग

@matrixwebtech उदाहरणों के लिए मेरे अद्यतन उत्तर की जाँच करें।
Al पर अब्दुलरहमान अलसोघेयेर Al

1
@Notflip हुड के तहत, timerका उपयोग करने के लिए लगता है setInterval()। लेकिन, आप animationFrameशेड्यूलर (जो उपयोग करता है requestAnimationFrame()) को डिफ़ॉल्ट asyncशेड्यूलर के बजाय इसका उपयोग करने के लिए पास कर सकते हैं । आपको बस इतना करना चाहिए Observable.timer(*,*,Scheduler.animationFrame), दिया गया है। import {Scheduler} from ‘rxjs’हालांकि, timerयह काम नहीं करता है। यह अभी भी उपयोग करने लगता है setInterVal()। हालांकि, अन्य प्रकार के अवलोकन योग्य जैसे Observable.range(0,1000,Scheduler.animationFrame), requestAnimationFrameका उपयोग सुनिश्चित करने के लिए किया जाता है। प्रदर्शन के लिहाज से, मैं अभी आपको निश्चित रूप से जवाब नहीं दे सकता।
अब्दुल्रहमान अलसोघैर

79

एक अन्य उपाय टिमरऑब्जर्वेबल का उपयोग करना है

TimerObservable Observable का एक उपवर्ग है।

import {Component, OnInit, OnDestroy} from '@angular/core';
import {Subscription} from "rxjs";
import {TimerObservable} from "rxjs/observable/TimerObservable";

@Component({
  selector: 'app-component',
  template: '{{tick}}',
})
export class Component implements OnInit, OnDestroy {

  private tick: string;
  private subscription: Subscription;

  constructor() {
  }

  ngOnInit() {
    let timer = TimerObservable.create(2000, 1000);
    this.subscription = timer.subscribe(t => {
      this.tick = t;
    });
  }

  ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}

पुनश्च: सदस्यता समाप्त करने के लिए मत भूलना।


3
सदस्यता समाप्त हिस्सा महत्वपूर्ण है
Tucker

आप कैसे सदस्यता समाप्त करते हैं? और कब?
मिगुएल स्टीवंस

1
@Notflip ngOnDestroy को घटक विखंडन के दौरान कहा जाता है: this.subscription.unsubscribe();सदस्यता समाप्त करना।
फिलिप

आप इसे ऊपर संदर्भित किए बिना इस। सदस्यता का उपयोग कैसे कर सकते हैं?
विन्नमुक्का

2
आप इसे कैसे रोकते और पुनः आरंभ करते हैं?
दानी

11
import {Component, View, OnInit, OnDestroy} from "angular2/core";

import { Observable, Subscription } from 'rxjs/Rx';

@Component({

})
export class NewContactComponent implements OnInit, OnDestroy {

    ticks = 0;
    private timer;
    // Subscription object
    private sub: Subscription;


    ngOnInit() {
        this.timer = Observable.timer(2000,5000);
        // subscribing to a observable returns a subscription object
        this.sub = this.timer.subscribe(t => this.tickerFunc(t));
    }
    tickerFunc(tick){
        console.log(this);
        this.ticks = tick
    }

    ngOnDestroy(){
        console.log("Destroy timer");
        // unsubscribe here
        this.sub.unsubscribe();

    }


}

3
यह कुछ भी नहीं जोड़ता है जो पहले से ही अन्य उत्तरों में नहीं बताया गया है, या यह नहीं करता है?
गुंटर ज़ोचबॉयर

5

Rxjs 6.2.2 और कोणीय 6.1.7 के साथ, मुझे एक मिल रहा था:

Observable.timer is not a function

त्रुटि। इस जगह से हल किया गया था Observable.timerके साथ timer:

import { timer, Subscription } from 'rxjs';

private myTimerSub: Subscription;    

ngOnInit(){    
    const ti = timer(2000,1000);    
    this.myTimerSub = ti.subscribe(t => {    
        console.log("Tick");    
    });    
}    

ngOnDestroy() {    
    this.myTimerSub.unsubscribe();    
}

3
सदस्यता समाप्त करने के लिए, आपके पास @ alexis-poo जैसा सदस्यता चर होना चाहिए। देखें: stackoverflow.com/questions/40181169/... । मैं आपके जवाब के आधार पर उस संबंध में लिखित रूप में काम नहीं कर रहा हूं।
रीड करें

मैं इस आदमी से प्यार करता हूँ जो हमेशा नवीनतम कोणीय संस्करणों में पोस्ट्स को अपडेट कर रहा है ... हर बार एंगुलरजेएस और एंगुलर के साथ इतना संघर्ष। धन्यवाद दोस्त!
चेनस्टेयर

4

आप बस सेटइंटरवल उपयोगिता का उपयोग कर सकते हैं और कॉलबैक के रूप में तीर फ़ंक्शन का उपयोग कर सकते हैं ताकि thisघटक उदाहरण को इंगित करेगा।

पूर्व के लिए:

this.interval = setInterval( () => { 
    // call your functions like 
    this.getList();
    this.updateInfo();
});

अपने ngOnDestroy जीवन चक्र हुक के अंदर, अंतराल को साफ़ करें।

ngOnDestroy(){
    clearInterval(this.interval);
}

3

मुझे एक समस्या का सामना करना पड़ा जिसे मुझे एक टाइमर का उपयोग करना था, लेकिन मुझे उन्हें 2 घटक एक ही समय, एक ही स्क्रीन में प्रदर्शित करना था। मैंने टाइमरऑब्जर्वेबल को एक सेवा में बनाया है। मैंने दोनों घटक में टाइमर की सदस्यता ली, और क्या हुआ? इसे सिंक नहीं किया जाएगा, क्योंकि नई सदस्यता हमेशा अपनी स्ट्रीम बनाती है।

मैं जो कहना चाहूंगा, वह यह है कि यदि आप कई स्थानों पर एक टाइमर का उपयोग करने की योजना बनाते हैं, तो हमेशा .publishReplay(1).refCount() ऑब्जर्वर के अंत में रखें, क्योंकि यह उसी धारा को हर बार प्रकाशित करेगा।

उदाहरण:

this.startDateTimer = Observable.combineLatest(this.timer, this.startDate$, (localTimer, startDate) => {
  return this.calculateTime(startDate);
}).publishReplay(1).refCount();

क्या आप इसे लागू कर सकते हैं?
नीतीश कुमार

1

एक npm पैकेज मिला जो RxJS को सेवा के रूप में आसान बनाता है।

https://www.npmjs.com/package/ng2-simple-timer

यदि आप एक ही घटक में कई बार उपयोग कर रहे हैं तो आप किसी मौजूदा टाइमर को 'सब्सक्राइब' कर सकते हैं ताकि आप बिलियन टाइमर न बना सकें।


1

यदि आप ngOnIn पर एक विधि चलाना चाहते हैं, तो आप ऐसा कुछ कर सकते हैं:

इस 2 पुस्तकालयों को आरएक्सजेएस से आयात करें:

import {Observable} from 'rxjs/Rx';
import {Subscription} from "rxjs";

फिर टाइमर और निजी सदस्यता की घोषणा करें, उदाहरण:

timer= Observable.timer(1000,1000); // 1 second for 2 seconds (2000,1000) etc
private subscription: Subscription;

जब टाइमर बंद हो जाता है तो अंतिम लेकिन कम से कम चलाने की विधि

ngOnInit() {
  this.subscription = this.timer.subscribe(ticks=> {
    this.populatecombobox();  //example calling a method that populates a combobox
    this.subscription.unsubscribe();  //you need to unsubscribe or it will run infinite times
  });
}

वह सब, कोणीय ५


0
Set Timer and auto call service after certain time
// Initialize from ngInit
ngOnInit(): void {this.getNotifications();}

getNotifications() {
    setInterval(() => {this.getNewNotifications();
    }, 60000);  // 60000 milliseconds interval 
}
getNewNotifications() {
    this.notifyService.getNewNotifications().subscribe(
        data => { // call back },
        error => { },
    );
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.