angular2에서 타이머를 만드는 방법


95

Angular 2에 타이머가 필요합니다.이 타이머는 시간 간격을두고 작업을 수행합니다 (일부 함수를 호출 할 수 있음).

Angular 2로이 작업을 수행하는 방법은 무엇입니까?


2
다른 사람들이 문제를 재현 할 수 있도록 충분한 코드 만 포함하십시오. 이에 대한 도움이 필요하면 최소, 완전 및 검증 가능한 예제를 만드는 방법을 읽어보십시오. 링크 할 수있는 문제의 실제 예를 만들 수있는 경우 (예 : sqlfiddle.com 또는 jsbin.com ) 그렇게합니다. 또한 질문 자체에 코드를 포함합니다. 모든 사람이 외부 사이트에 액세스 할 수있는 것은 아니며 시간이 지나면 링크가 끊어 질 수 있습니다.
Prasad

15
이것은 실제로 매우 유용한 질문입니다. Observable은 배우고 사용하는 데 중요합니다. 사용자가이 질문에서 이동할 코드가 없더라도 다른 사람들에게 도움이 될 것입니다.
Winnemucca

이 댓글은 동일한 버킷에 속하지만 이전 2 명 중 누구도 도움을주지 않았으며 질문에 댓글 만 달았습니다 ... 분명히 사람들은 이제 setTimeout을 다시 사용하고 있습니다.
rbnzdave

에서는 setTimeout 정말 구식이다 - 신선한 TimerObservable 밖으로 체크 아웃 아래
필립

2
let this._timer = setInterval (() => this.getWidgetData (), 10000); 그리고 clearInterval (this._timer); 파괴에
crh225

답변:


129

이전의 모든 답변 외에도 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);
  }
}

그리고 여기에 작동하는 플런 커가 있습니다.

업데이트 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);
    });
}

이 플 런커 에서 작동 코드를 확인하십시오 .


모든 틱에서 호출되는`timer.subscribe (t => this.ticks = t);`에 함수를 전달할 수 있습니까?
kuntal

예 @matrixwebtech '기능 (t) = {this.ticks t}와 완전히 동일한't => this.ticks = t '는 람다 식
압둘라 Alsoghayer

나는 timer.subscribe (function name () {console.log ( "hhhhhh")}); 작동하지만 별도로 선언 한 함수를 호출하는 방법 ngOnInit () {let timer = Observable.timer (2000,1000); timer.subscribe (function () {this.fun ();}); } fun () {console.log ( "hhhhhh")}
kuntal

@matrixwebtech 예제에 대한 업데이트 된 답변을 확인하십시오.
Abdulrahman Alsoghayer

1
후드 @Notflip, timer사용하는 것 같다 setInterval(). 그러나 기본 스케줄러 대신 animationFrame사용 하도록 스케줄러 (사용 requestAnimationFrame())를 전달할 수 있습니다 async. 당신이해야 할 일은 Observable.timer(*,*,Scheduler.animationFrame)주어진. import {Scheduler} from ‘rxjs’하지만 timer작동하지 않는 것 같습니다. 여전히 사용하는 것 같습니다 setInterVal(). 그러나 관찰과 같은 다른 종류의에서 Observable.range(0,1000,Scheduler.animationFrame)의이 requestAnimationFrame확인에 사용됩니다. 성능면에서 지금 당장은 확실하게 대답 할 수 없습니다.
Abdulrahman Alsoghayer

79

또 다른 해결책은 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 : 탈퇴하는 것을 잊지 마세요.


3
구독 취소 부분이 핵심입니다
Tucker

구독 취소는 어떻게하나요? 그리고 언제?
Miguel Stevens

1
@Notflip ngOnDestroy는 구성 요소 초기화 해제 중에 호출됩니다. this.subscription.unsubscribe();구독 취소.
Philip

위에서 언급하지 않고 this.subscription을 어떻게 사용할 수 있습니까?
Winnemucca

2
일시 중지하고 다시 시작하는 방법은 무엇입니까?
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
이것은 다른 답변에서 아직 설명되지 않은 내용을 추가하지 않습니까?
Günter Zöchbauer

5

rxjs 6.2.2 및 Angular 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/… . 나는 그 점에서 쓰여진대로 작동하지 않는 당신의 대답을 기반으로합니다.
Reid

나는 항상 최신 Angular 버전으로 게시물을 업데이트하는이 사람을 사랑합니다. 감사합니다!
chainstair

4

setInterval 유틸리티를 사용하고 화살표 함수를 콜백으로 사용 this하여 구성 요소 인스턴스를 가리킬 수 있습니다.

예 :

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

ngOnDestroy 수명주기 후크 내에서 간격을 지 웁니다.

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

3

타이머를 사용해야하는 문제에 직면했는데, 두 구성 요소를 동시에 같은 화면에 표시해야했습니다. 서비스에서 timerObservable을 만들었습니다. 두 구성 요소에서 타이머를 구독했는데 어떻게 되었습니까? 동기화되지 않으므로 새 구독은 항상 자체 스트림을 생성합니다.

제가 말하고 싶은 것은 여러 장소에서 하나의 타이머를 사용하려는 경우 항상 .publishReplay(1).refCount() Observer 끝에 두면 매번 동일한 스트림을 게시한다는 것입니다.

예:

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

구현을 공유 할 수 있습니까?
Nitish Kumar


1

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


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.