Angular2 Observable范围问题

时间:2017-01-13 21:43:53

标签: javascript angular rxjs

我以为我理解了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之外的构造函数中赋值它。

如何确保我在此示例中始终处于同一范围内?

1 个答案:

答案 0 :(得分:1)

Hah并且在发布问题的几分钟内按照正常情况我解决了它。结果我确实理解了胖箭头中的范围,只是没有在文档监听器上使用它。

更改

document.onkeypress = this.resetTimer;

document.onkeypress = e => this.resetTimer();

让一切都完美无缺!