javascript - 表示 - angular2でタイマーを作成する方法




javascript タイマー 表示 (6)

私はAngular 2にタイマーが必要です。タイマーは時間間隔の後にカチカチ音をたてて、いくつかのタスクを実行します(いくつかの関数を呼び出すかもしれません)。

Angular 2でこれを行う方法は?


RxJSをサービスとして簡単に使用できるnpmパッケージを見つけました。

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

同じコンポーネントで何度も使用している場合、膨大なタイマーを作成しないように、既存のタイマーを「サブスクライブ」できます。


ngOnInitでメソッドを実行する場合、次のようなことができます。

RXJSからこの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
  });
}

それだけです、Angular 5


タイマーを使用しなければならないという問題に直面しましたが、2つのコンポーネントで同じ時間、同じ画面に表示する必要がありました。 サービスでtimerObservableを作成しました。 両方のコンポーネントでタイマーをサブスクライブしましたが、どうなりましたか? 同期されないため、新しいサブスクリプションは常に独自のストリームを作成します。

私が言いたいのは、複数の場所で1つのタイマーを使用する予定がある場合は、常に .publishReplay(1).refCount() をオブザーバーの最後に置くと、毎回同じストリームを公開することです。

例:

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

以前のすべての回答に加えて、RxJS Observablesを使用してそれを行います

Observable.timer を確認してください

サンプルコードは次のとおりです。2秒後に開始され、1秒ごとにティックします。

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

そして、ここに働く plunker

更新 AppComponentクラスで宣言された関数を呼び出す場合、次のいずれかを実行できます。

**呼び出したい関数の名前が func であると仮定すると、

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

上記のアプローチの問題は、func内で「this」を呼び出すと、AppComponentオブジェクトの代わりにサブスクライバオブジェクトを参照するため、おそらく望んでいないものです。

ただし、以下のアプローチでは、ラムダ式を作成し、その中で関数 func を呼び出します。 このように、funcの呼び出しはまだAppComponentのスコープ内にあります。 私の意見では、これが最善の方法です。

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

作業コードについては、 このプランカー を確認してください。


別の解決策は、TimerObservableを使用することです

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

PS:購読を解除することを忘れないでください。


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

    }


}




angular