我有一个看起来像这样的超时功能:
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();
}
答案 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);