2016-10-12 42 views
1

我有一个超时功能,看起来像这样:的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的值是改变。 问题是this.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(); 
    } 
+0

你的超时被调用了吗? –

回答

3

当传递函数和方法而言,总是要如何影响的this范围照顾。默认情况下,JS使用调用者的范围。

有一些方法可以显式地指定的范围内使用。

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

,但我不能肯定,因为你的代码不显示在代码是从调用。

或者

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

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

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

它是登录方法在角2登录 –

+1

请编辑您的问题,并在那里添加代码。评论中的代码是不可读的。我想知道的是调用代码与被调用代码的关系(相同的类,其他类,其他类如何获得对该函数的引用) –

+1

谢谢!这工作! :) –

0

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

我会建议使用匿名函数,该函数调用所需的功能,而不是:

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

setTimeout将函数调用添加到事件循环,并从那里启动它。 因此this丢失并设置为window(默认值)。您必须将this绑定到您的功能。

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

有两个备选方案,以解决您的问题,第一个(如对方回复建议)是你的方法调用this结合,以保持环境。

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

第二种解决方案是在调用它宣布退出作为变量,这样,你不要松背景:

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

然后调用这样说:

setTimeout(this.logout, 1000);