我以为我理解了javascript范围,但我认为我必须离开某个地方......
我创建了一个observable(用于会话超时类型功能),它减少一个数字并每秒发出一次。我可以订阅这个罚款并看到数据变化很大。我的问题是,有时Observer之外的事件会重置"计时器;但是,观察者内部使用的值不会反映此重置。
我原以为通过使用胖箭头语法this
会被保留,但显然我在某处不正确。
observable在构造函数中创建,该构造函数作为单例注入到模块中。
@Injectable()
export class TimeoutService {
private _internalTimer: number;
private _logoutThreshold: number;
private _timer$: Observable<number>;
constructor(@Inject(DOCUMENT) private document: any) {
this._logoutThreshold = 3000;
document.onkeypress = this.resetTimer;
this._internalTimer = this._logoutThreshold;
this._timer$ = new Observable(observer => {
observer.next(this._internalTimer)
setInterval(() => {
this._internalTimer--;
console.log("timer in observer", this._internalTimer);
observer.next(this._internalTimer);
}, 1000);
});
}
resetTimer() {
this._internalTimer = this._logoutThreshold;
console.log("timer in reset", this._internalTimer);
}
}
在这个例子中,&#34;定时器在观察者&#34;效果很好,从3000开始,每秒倒计时;然而,&#34;计时器在重置&#34;总是未定义的。这是令人困惑的,因为我认为在最奇怪的情况下它只是一个常数3000因为我在Observable之外的构造函数中赋值它。
如何确保我在此示例中始终处于同一范围内?
答案 0 :(得分:1)
Hah并且在发布问题的几分钟内按照正常情况我解决了它。结果我确实理解了胖箭头中的范围,只是没有在文档监听器上使用它。
更改
document.onkeypress = this.resetTimer;
到
document.onkeypress = e => this.resetTimer();
让一切都完美无缺!