Angular2'de zamanlayıcı nasıl oluşturulur


97

Angular 2'de bir zaman aralığından sonra çalışan ve bazı görevler yapan bir zamanlayıcıya ihtiyacım var (bazı işlevleri çağırabilir).

Bunu Angular 2 ile nasıl yapabilirim?


2
Başkalarının sorunu yeniden oluşturmasına izin verecek kadar kod ekleyin. Bununla ilgili yardım için, Minimal, Tam ve Doğrulanabilir bir örnek nasıl oluşturulur? Bölümünü okuyun. Bağlanabileceğiniz problemin canlı bir örneğini oluşturmak mümkünse (örneğin, sqlfiddle.com veya jsbin.com'da ), o zaman yapın - ancak aynı zamanda sorunuza kodu da ekleyin. Herkes harici sitelere erişemez ve bağlantılar zamanla bozulabilir.
Prasad

15
Bu aslında çok yardımcı bir soru. Gözlenebilirlerin öğrenilmesi ve kullanılması önemlidir. Kullanıcının bu sorudan gidecek kodu olmasa bile başkalarına yardımcı olacaktır.
Winnemucca

Bu yorum aynı kovaya düşüyor, ancak önceki 2 kişinin hiçbiri yardımcı olmadı, sadece soruya yorum yaptı ... Görünüşe göre insanlar şimdi setTimeout'u tekrar kullanıyor.
rbnzdave

setTimeout gerçekten eski usul - aşağıdaki yeni TimerObservable'a göz atın
Philip

2
let this._timer = setInterval (() => this.getWidgetData (), 10000); ve clearInterval (this._timer) çağırdığınızdan emin olun; yok üzerinde
crh225

Yanıtlar:


129

Önceki tüm cevaplara ek olarak, bunu RxJS Observables kullanarak yapardım

lütfen Observable.timer'ı kontrol edin

İşte örnek bir kod, 2 saniye sonra başlayacak ve ardından her saniye işaretlenecek:

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

Ve işte çalışan bir dalgıç

Güncelle AppComponent sınıfında bildirilen bir işlevi çağırmak istiyorsanız, aşağıdakilerden birini yapabilirsiniz:

** Çağırmak istediğiniz işlevin adı func olduğunu varsayarsak ,

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

Yukarıdaki yaklaşımla ilgili sorun, 'this' inside func olarak adlandırırsanız, bunun AppComponent nesnesi yerine abone nesnesine başvurmasıdır ki bu muhtemelen istediğiniz şey değildir.

Bununla birlikte, aşağıdaki yaklaşımda, bir lambda ifadesi oluşturursunuz ve içindeki işlevi func olarak adlandırırsınız. Bu şekilde, func çağrısı hala AppComponent kapsamındadır. Bence bunu yapmanın en iyi yolu bu.

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

çalışma kodu için bu tıkayıcıyı kontrol edin .


Her tıklamada çağrı olan `timer.subscribe (t => this.ticks = t); 'ye bir fonksiyon geçirebilmeli miyim?
kuntal

@matrixwebtech Evet, 't => this.ticks = t' bir lambda ifadesidir, 'function (t) {this.ticks = t}' ile tamamen aynı
Abdulrahman Alsoghayer

Timer.subscribe (işlev adı () {console.log ("hhhhhh")}); hangisi çalışıyor ama ayrı olarak bildirilen bir işlevi nasıl çağırırım ngOnInit () {let timer = Observable.timer (2000,1000); timer.subscribe (function () {this.fun ();}); } fun () {console.log ("hhhhhh")}
kuntal

@matrixwebtech lütfen örnekler için güncellenmiş cevabımı kontrol edin.
Abdulrahman Alsoghayer

1
@Notflip Kaputun altında, timerkullanıyor gibi görünüyor setInterval(). Ancak, animationFramezamanlayıcıyı (kullanan requestAnimationFrame()) varsayılan asynczamanlayıcı yerine kullanmak için geçirebilirsiniz . Yapmanız gereken tek şey Observable.timer(*,*,Scheduler.animationFrame), verilmiş olsa da import {Scheduler} from ‘rxjs’, üzerinde timerçalışmıyor gibi görünüyor. Hala kullanıyor gibi görünüyor setInterVal(). Ancak, diğer gözlemlenebilir türlerde, örneğin Observable.range(0,1000,Scheduler.animationFrame), requestAnimationFramekesinlikle kullanılır. performans açısından şu anda size kesin bir cevap veremem.
Abdulrahman Alsoghayer

79

Başka bir çözüm de TimerObservable kullanmaktır.

TimerObservable , Observable'ın bir alt sınıfıdır.

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

Not: Abonelikten çıkmayı unutmayın.


3
abonelikten çıkma kısmı anahtardır
Tucker

abonelikten nasıl çıkarsın? ve ne zaman?
Miguel Stevens

1
@Notflip ngOnDestroy, bileşen deinitialization sırasında çağrılır: this.subscription.unsubscribe();abonelikten çıkar.
Philip

This.subscription'ı yukarıda kaynak göstermeden nasıl kullanabilirsiniz?
Winnemucca

2
Nasıl duraklatır ve yeniden başlatırsınız?
Dani

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
Bu, diğer cevaplarda daha önce açıklanmayan herhangi bir şeyi eklemiyor mu?
Günter Zöchbauer

7

Rxjs 6.2.2 ve Angular 6.1.7 ile şunu alıyordum:

Observable.timer is not a function

hata. Bu, Observable.timerşununla değiştirilerek çözüldü 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
Aboneliği iptal etmek için yukarıdaki @ alexis-poo gibi bir abonelik değişkenine sahip olmanız gerekir. Bakınız: stackoverflow.com/questions/40181169/… . Bunu cevabınızın bu konuda yazıldığı gibi çalışmamasına dayandırıyorum.
Reid

Gönderileri her zaman en yeni Angular sürümlerine güncelleyen bu adamı seviyorum ... Her seferinde AngularJS ve Angular ile çok mücadele ediyorum. Teşekkürler dostum!
chainstair

4

Basitçe setInterval yardımcı programını kullanabilir ve ok işlevini geri çağırma olarak kullanabilirsiniz, böylece thisbileşen örneğini gösterecektir.

Örneğin:

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

NgOnDestroy yaşam döngüsü kancanızın içindeki aralığı temizleyin.

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

3

Zamanlayıcı kullanmak zorunda olduğum bir sorunla karşılaştım, ancak bunları aynı anda, aynı ekranda 2 bileşen halinde görüntülemek zorunda kaldım. Bir hizmette timerObservable'ı oluşturdum. Her iki bileşendeki zamanlayıcıya abone oldum ve ne oldu? Senkronize edilmez, çünkü yeni abonelik her zaman kendi akışını oluşturur.

Söylemek istediğim, bir zamanlayıcıyı birkaç yerde kullanmayı planlıyorsanız, her zaman .publishReplay(1).refCount() Gözlemcinin sonuna koyun , çünkü her seferinde aynı akışı yayınlayacaktır.

Misal:

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

uygulamasını paylaşır mısın?
Nitish Kumar


1

NgOnInit'te bir yöntem çalıştırmayı düşünüyorsanız, şöyle bir şey yapabilirsiniz:

bu 2 kitaplığı RXJS'den içe aktarın:

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

Ardından zamanlayıcı ve özel aboneliği bildirin, örneğin:

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

Son fakat en az değil, zamanlayıcı durduğunda yöntemi çalıştır

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

Hepsi bu, Açısal 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 => { },
    );
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.