2016-12-01 1 views
0

Typescript (및 Angular 2)로 메트로놈을 만들려고합니다. 기본 사항을 알려준 Nitzan-Tomer (Typescript Loop with Delay)에게 감사드립니다.Typescript Metronome

이제는 메트로놈을 시작한 후에 간격을 변경할 수 없다는 문제가 있습니다. 소리들 사이의 속도를 바꾸는 슬라이더를 상상해보십시오 (=> 간격).

let theLoop: (i: number) => void = (i: number) => { 
    setTimeout(() => { 
     metronome.play(); 
     if (--i) { 
      theLoop(i); 
     } 
    }, 3000); 
}; 

theLoop(10); 

여기서 간격은 3000입니다. 기능이 트리거 된 후에이를 변경할 수 있기를 원합니다. (어쩌면 또한 ...

그냥 메트로놈 사운드 10 번 재생되지해야하기 때문에

내가 클래스의 생각 ...?를 i: number 제거? 그러나 나는 그것을 구축하는 방법을 잘 모르겠어요 얻을
+1

가능한 중복 (http://stackoverflow.com/questions/1280263/changing -interval-of-set-running-while-running) – Hamms

+0

N 특히 질문에 대해서는 좀 더 설명적인 함수 이름을 사용하는 것이 좋습니다. 'theLoop'은 독자에게 당신의 기능이 무엇인지 알려주지 않는다. 'startMetronomeCycle()'과 같은 것이 더 좋을 수도 있습니다. –

+0

불행히도 그들은 SetInterval과 DOM을 사용하고 있습니다 ... 나는 평범한 javascript/typescript/angular2 메트로놈을 만들려고합니다. – Taremeh

답변

1

가 여기에 그것을 할 수있는 간단한 클래스입니다 :

class Metronome { 
    private interval: number; 
    private timer: number; 

    constructor(interval = 3000) { 
     this.interval = interval; 
    } 

    start(): void { 
     this.tick(); 
    } 

    stop() { 
     clearTimeout(this.timer); 
    } 

    setInterval(interval: number) { 
     this.interval = interval; 
    } 

    private tick() { 
     // do something here 
     this.timer = setTimeout(this.tick.bind(this), this.interval); 
    } 
} 

(code in playground)가 실행중인 상태에서는 setInterval의 간격을 변경]의

+0

왜'setInterval (interval : number)'를'start (interval : number)'에 직접 구현하지 않습니까? – Taremeh

+1

둘을 구분하는 것이 현명한 방법이라고 생각합니다. 'tick' 메쏘드는 반복적으로 호출되고,'start' 메쏘드는'stop'의 대칭 메쏘드입니다. 또한 반복하지 않으려는'start'에서 더 많은 일을하고 싶을 수도 있습니다. –