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

标签 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 的值在哪里更改。 问题是 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(); 
  }

最佳答案

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

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

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

但我不能确定,因为您的代码没有显示调用代码的位置。

或者

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

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

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

关于javascript - setTimeout() 无法正确调用嵌套函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39994442/

相关文章:

javascript - Angular - 没有可排序的方法

javascript - $(e.target).hasClass() 不工作

javascript - 将默认文本插入 TinyMCE4 中的 'link' 插件

html - 如何在动态 img 标签中添加边框?

css - 如何使用 angular 4 和 bootstrap 4 设置多列?

javascript - 在 javascript 中使用 fetch 请求 API 时出现 CORS 策略错误

javascript - 打印 YouTube 视频标题脚本,仅提供视频 ID

javascript - 使用 Javascript 检查图像 URL 是否有效

javascript - 在我的自定义模态框内滚动

angular - 无法在 IE 中将 SVG 下载为 PNG