3

我有一个我试图用来管理客户端会话的类,它看起来像这样:

var sessionmanager;

sessionmanager = (function() {

  sessionmanager.name = 'sessionmanager';

  function sessionmanager(timeout, action) {
    if (action != null) {
      this.action = action;
    } else {
      this.action = null;
    }
    if (timeout != null) {
      this.timeout = timeout * 60;
    } else {
      this.timeout = 0;
    }
  }

  sessionmanager.prototype.run = function() {
    return window.setInterval(this.tick, 1000);
  };

  sessionmanager.prototype.sessionExpired = function() {
    if (this.action != null) {
      window.navigate("timeout.asp");
    }
  };

  sessionmanager.prototype.setTimeout = function(timeout) {
    return this.timeout = timeout;
  };

  sessionmanager.prototype.tick = function() {
    this.timeout -= 1;
    if (this.timeout < 1) {
      return sessionExpired();
    }
  };

  return sessionmanager;

})();

tick但是,当我在从回调中调用的函数内部进行调试时,setInterval我得到this.timeout = NaN

我猜我的范围不正确?请帮忙?我是javascript新手...

4

3 回答 3

6

如果setInterval调用该函数,它不会this像您期望的那样设置值。调用this.tick() 确实正确设置了它,但只是传递函数并以另一种方式调用它不会。您必须将this值绑定到您想要的值:

setInterval(this.tick.bind(this), 1000);

这在较新的浏览器上可用,但有可用的填充程序。

另外,您可能的意思是this.sessionExpired(),因为这是它的定义。return在那里没有多大意义,因为setInterval不关心返回值。

于 2012-07-04T17:35:09.890 回答
0

你有没有设置过超时?你可能想要

sessionmanager.timeout=0;

类定义中的某处。

于 2012-07-04T17:31:13.380 回答
0

在 ES7 Javascript 中,您可以执行以下操作:

window.setInterval(::this.tick, 1000);

双冒号语法::.bind(this).

于 2015-12-08T00:03:25.263 回答