setTimeout()无法正确调用嵌套函数

时间:2016-10-12 08:55:52

标签: javascript jquery angular settimeout

我有一个看起来像这样的超时功能:

setTimeout(this.logout, 1000);

登录方法:

  logout() {
    this.auth_token = ""; 
    this.loggedIn = false;
    this.emitLogedInStatusChange();
  }

 isLoggedIn() {
    return this.loggedIn;
  }

  private emitLogedInStatusChange() {
        this.LoggedInStatusChangedEmitter.emit({value: this.loggedIn});
    }

其中事件发射器告诉主组件其中loggedIn的值在哪里被更改。 问题是这个..emitLogedInStatusChange();我收到错误信息的地方:

this.emitLogedInStatusChange is not a function

我的问题是如何在注销中正确调用此函数,以便setTimeout可以工作?

这就是我所说的:

map((res) => { 
 if (res.username === username) { 
   this.auth_token = res.access_token; 
   this.sessionId = res.SessionID;  
   this.loggedIn = true; 
   this.expires = res.expires_in; 
   setTimeout(this.logout, this.expires*1000); 
   this.emitLogedInStatusChange(); 
  }

4 个答案:

答案 0 :(得分:5)

在传递函数和方法时,始终需要注意它如何影响this的范围。默认情况下,JS使用调用者的范围。

有多种方法可以明确指定要使用的范围:

setTimeout(this.logout.bind(this), 1000);

但我无法确定,因为您的代码无法显示代码的调用位置。

或者

setTimeout(() => this.logout(), 1000);

可以使用,但似乎不那么简洁。对于将参数传递给回调的其他用例,它们需要重复,如

someFunction((a, b, c) => this.logout(a, b, c), 1000);

答案 1 :(得分:2)

setTimeout会向函数循环添加函数调用,并从那里激活它。  因此this丢失并设置为window(默认)。您必须将this绑定到您的函数。

setTimeout(this.logout.bind(this), 1000);

答案 2 :(得分:2)

有两种方法可以解决您的问题,第一种方法(正如其他回复建议的那样)是将方法调用绑定到this以保持上下文。

setTimeout(this.logout.bind(this), 1000);

第二个解决方案是将logout声明为变量,这样在调用它时不会松开上下文:

logout = () => {
    this.auth_token = ""; 
    this.loggedIn = false;
    this.emitLogedInStatusChange();
}

然后你这样称呼它:

setTimeout(this.logout, 1000);

答案 3 :(得分:0)

您正在将该函数传递给setTimeout()。

我建议使用匿名函数,它会调用所需的函数:

setTimeout(function(){
    this.logout();
}, 1000);