কৌণিক 2 তে কিভাবে টাইমার তৈরি করবেন


97

আমার কৌনিক 2 তে একটি টাইমার দরকার যা একটি সময়ের ব্যবধানের পরে টিক দেয় এবং কিছু কাজ করে (কিছু ফাংশন হিসাবে ডাকা হতে পারে)।

কৌনিক 2 দিয়ে এটি কীভাবে করবেন?


4
অন্যদের সমস্যার পুনঃজনন করার অনুমতি দেওয়ার জন্য পর্যাপ্ত কোড অন্তর্ভুক্ত করুন। এটির সাহায্যের জন্য, একটি ন্যূনতম, সম্পূর্ণ এবং যাচাইযোগ্য উদাহরণ কীভাবে তৈরি করবেন তা পড়ুন। যদি আপনি যে সমস্যার সাথে লিঙ্ক করতে পারেন তার একটি জীবন্ত উদাহরণ তৈরি করা সম্ভব হয় (উদাহরণস্বরূপ, sqlfiddle.com বা jsbin.com এ ) তবে তা করুন - তবে নিজের প্রশ্নের মধ্যে কোডটি অন্তর্ভুক্ত করুন। প্রত্যেকেই বাহ্যিক সাইটগুলিতে অ্যাক্সেস করতে পারে না এবং লিঙ্কগুলি সময়ের সাথে সাথে ভেঙে যেতে পারে।
প্রসাদ

15
এটি আসলে একটি খুব সহায়ক প্রশ্ন। পর্যবেক্ষণযোগ্যগুলি শিখতে এবং ব্যবহার করা গুরুত্বপূর্ণ। এমনকি যদি ব্যবহারকারীটির কাছে এই প্রশ্নটি থেকে যাওয়ার কোড নাও ছিল তবে অন্যদের পক্ষে সহায়ক হবে।
Winnemucca

এই মন্তব্যটি একই বালতিতে পড়েছে, তবে পূর্ববর্তী 2 জনের মধ্যে দু'জনের মধ্যে কেউই সহায়তা করেনি, কেবল এই প্রশ্নে মন্তব্য করেছে ... দৃশ্যত লোকেরা এখন আবার সেটটাইমআউট ব্যবহার করছে।
rbnzdave

সেটটাইমআউটটি আসলেই পুরানো-স্কুল - নীচে সতেজ টাইমর সংরক্ষণযোগ্য চেক আউট
ফিলিপ

4
যাক এটি._টিমার = সেটইন্টারভাল (() => this.getWidgetData (), 10000); এবং ক্লিয়ারইন্টারভাল (এটি ._টিমার) কল করতে ভুলবেন না; অন ​​ধ্বংস
crh225

উত্তর:


129

পূর্ববর্তী সমস্ত উত্তরগুলি ছাড়াও, আমি এটি আরএক্সজেএস পর্যবেক্ষণগুলি ব্যবহার করে করব

পর্যবেক্ষণযোগ্য.টিমার পরীক্ষা করুন

এখানে একটি নমুনা কোড রয়েছে, এটি 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);
  }
}

এবং এখানে একটি কর্মজীবী প্লামকার

আপডেট আপনি যদি অ্যাপকোম্পোনটি ক্লাসে ঘোষিত কোনও ফাংশন কল করতে চান তবে আপনি নিম্নলিখিতগুলির একটি করতে পারেন:

** আপনি যে ফাংশনটি কল করতে চান তা ধরে নিয়ে ফানকের নাম দেওয়া হয়েছে ,

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

উপরোক্ত পদ্ধতির সমস্যাটি হ'ল যদি আপনি এইটিকে "ফান" এর অভ্যন্তরে কল করেন তবে এটি অ্যাপকোম্পোন্ট অবজেক্টের পরিবর্তে গ্রাহক অবজেক্টকে উল্লেখ করবে যা সম্ভবত আপনি চান না।

যাইহোক, নীচের পদ্ধতির মধ্যে, আপনি একটি ল্যাম্বডা এক্সপ্রেশন তৈরি করেন এবং এর ভিতরে ফাংশন ফানকে কল করেন । এইভাবে, ফান টু কলটি এখনও অ্যাপকোম্পোনমেন্টের স্কোপের মধ্যে রয়েছে। এটি আমার মতে এটি করার সর্বোত্তম উপায়।

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

কাজের কোডের জন্য এই প্লাঙ্কারটি পরীক্ষা করুন check


আমি কি function timer.subscribe (t => this.ticks = t); every প্রতি টিকের মধ্যে কোন কলটি পাস করতে পারি?
কুঁটাল

@matrixwebtech হ্যাঁ, 't => this.ticks = t' একটি ল্যাম্বডা এক্সপ্রেশন, ঠিক একই রকম 'ফাংশন (টি) {this.ticks = t}'
আবদুল রহমান এছাড়াওঘেয়ার

আমি টাইমরস্ক্রাইব (ফাংশন নাম () so কনসোল.লগ ("hhhhhh")}) চেষ্টা করি; যা কাজ করছে তবে কীভাবে আমি এমন কোনও ফাংশন বলি যা পৃথকভাবে ঘোষণা করে এনজিওএনইনিট () {যাক টাইমার = অবজারভেবল.টিমার (2000,1000); timer.subscribe (ফাংশন () {this.fun ();}); } মজা () {
কনসোল.লগ

@matrixwebtech দয়া করে উদাহরণের জন্য আমার আপডেট হওয়া উত্তরটি পরীক্ষা করুন।
আবদুলাহমান এছাড়াওঘেয়ের

4
@ নটফ্লিপ হুডের নীচে timerব্যবহার করা হয়েছে বলে মনে হচ্ছে setInterval()। তবে, আপনি ডিফল্ট শিডিয়ুলারের পরিবর্তে এটি ব্যবহার করতে animationFrameশিডিয়ুলার (যা ব্যবহার করে requestAnimationFrame()) পাস করতে পারেন async। আপনাকে যা করতে হবে তা হ'ল Observable.timer(*,*,Scheduler.animationFrame), প্রদত্ত import {Scheduler} from ‘rxjs’though তবে যদিও timerএটি কাজ করছে বলে মনে হয় না। এটি এখনও ব্যবহার করা হয় বলে মনে হচ্ছে setInterVal()। যাইহোক, পর্যবেক্ষণযোগ্য যেমন অন্য ধরনের উপর Observable.range(0,1000,Scheduler.animationFrame), requestAnimationFrameনিশ্চিত জন্য ব্যবহৃত হয়। পারফরম্যান্স অনুসারে, আমি এখনই আপনাকে নিশ্চিত উত্তর দিতে পারব না।
আবদুল্লাহমান এছাড়াওঘেয়ের

79

আরেকটি সমাধান হ'ল টাইমারঅবসার্ভেবল ব্যবহার

টাইমারঅবসার্ভেবল পর্যবেক্ষণযোগ্য একটি সাবক্লাস।

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();
  }
}

PS: সাবস্ক্রাইব করতে ভুলবেন না।


4
সাবস্ক্রাইব অংশটি কী
টকার

আপনি কীভাবে সাবস্ক্রাইব করবেন? এবং কখন?
মিগুয়েল স্টিভেন্স

4
@Notflip ngOnDestroy কে ডিনিটিটাইজেশন উপাদান অবলম্বন করার সময় বলা হয়: this.subscription.unsubscribe();সাবস্ক্রাইব করুন।
ফিলিপ

উপরের রেফারেন্স না দিয়ে আপনি কীভাবে এটি ব্যবহার করতে সক্ষম হন? সাবস্ক্রিপশনটি?
Winnemucca,

4
আপনি কীভাবে এটি থামিয়ে পুনরায় চালু করবেন?
দানি

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();

    }


}

4
এটি ইতিমধ্যে অন্য উত্তরে ব্যাখ্যা করা হয়নি এমন কিছু যুক্ত করে না, বা এটি করে?
গন্টার জ্যাচবাউয়ার

6

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();    
}

4
সাবস্ক্রাইবটি করতে, আপনার উপরে @ অ্যালেক্সিস-পু এর মতো সাবস্ক্রিপশন ভেরিয়েবল থাকতে হবে। দেখুন: স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / 40181169/… । আমি আপনার উত্তরের ভিত্তিতে এই বিষয়ে লিখিত হিসাবে কাজ না করে।
16:58

আমি এই ছেলেটিকে ভালবাসি যিনি সর্বদা পোস্টগুলি সর্বদা নতুন কৌণিক সংস্করণগুলিতে আপডেট করে চলেছেন ... অ্যাংুলারজেএস এবং কৌণিকের সাথে প্রতিবার এত লড়াই struggle ধন্যবাদ মানুষ!
চেইনস্টায়ার 22

4

আপনি কেবল সেটইন্টারভাল ইউটিলিটিটি ব্যবহার করতে পারেন এবং কলব্যাক হিসাবে তীর ফাংশনটি ব্যবহার করতে পারেন যাতে thisউপাদানটির উদাহরণটি নির্দেশ করা যায়।

প্রাক্তন হিসাবে:

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

আপনার এনজিওনডেস্ট্রয় লাইফাইসাইকেল হুকের অভ্যন্তরে অন্তর সাফ করুন।

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

একটি এনপিএম প্যাকেজ পেয়েছে যা পরিষেবা হিসাবে আরএক্সজেএস দিয়ে এটিকে সহজ করে তোলে।

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

আপনি বিদ্যমান টাইমারে 'সাবস্ক্রাইব' করতে পারেন যাতে আপনি একই উপাদানটিতে বহুবার ব্যবহার করে বাজিলিয়ান টাইমার তৈরি না করেন।


1

আপনি যদি এনজিওইনিতে কোনও পদ্ধতি চালানোর দিকে তাকান তবে আপনি এই জাতীয় কিছু করতে পারেন:

আরএক্সজেএস থেকে এই 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
  });
}

সবই, কৌণিক 5


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 => { },
    );
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.