私はAngular 2環境でタイマーを管理しようとしています。そして、clearTimeoutは約半分の時間しか正しく動作していないようです。私はTypeScriptで書いています。clearTimeoutが散発的に失敗する
私は、独自のサービスでタイマーを保つ:
export class TimeoutService {
constructor(
private router: Router,
private httpService: HttpService
) {}
//Properties
private timer;
//Methods
public clearTimer() {
clearTimeout(this.timer);
}
private logOut() {
return this.httpService.Post('api/session/logout', '');
}
private redirectToTimeoutPage() {
this.router.navigate(['/timeout']);
}
public refreshTimer() {
console.log('refreshing timer');
if (this.timer) {
this.clearTimer();
this.setTimer();
}
}
public startTimer() {
this.setTimer();
}
private setTimer() {
this.timer = setTimeout(() => {
this.logOut()
.then(() => {
this.clearTimer();
this.redirectToTimeoutPage();
});
}, 30000);
}
}
私はそれがそうでなければ、私はそれがあることを期待したときに呼び出され、いないされているrefreshTimer方法ではconsole.logから知っています。しかし、ほとんどの場合、以前のタイマーはclearTimeoutコールによって取り消されず、新しいタイマーに置き換えても30秒後に起動します。
私はこのことに関する他の質問をしてきましたが、私が見る限り、私の状況には該当しません。
私が解読できない1つの手がかりは、refreshTimer内のthis.setTimer()
への呼び出しを取り除くと、clearTimeout呼び出しが正常に機能しているようです。言い換えると、新しいタイマーを作成すると、何とか古いタイマーが生き残るようになります。私はここで何が欠けていますか?
ありがとうございました!
TimeoutServiceクラスの実際の使用状況を示すコードをいくつか含めることができますか? – Zack
ベストプラクティスとして、常に変数を初期化することをお勧めします。タイマーの場合(後でその存在をチェックしているので)、ヌルに初期化します(つまり、 'private timer = null;') –