【问题标题】:setTimeout() cannot call nested functions properlysetTimeout() 无法正确调用嵌套函数
【发布时间】:2017-02-21 00:14:22
【问题描述】:

我有一个如下所示的超时函数:

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
    });
}

where 事件发射器告诉主组件loggedIn 的值在哪里改变。 问题是 this.emitLogedInStatusChange(); 我收到一条错误消息:

this.emitLogedInStatusChange 不是函数

我的问题是如何在注销中正确调用此函数,以便 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(); 
  }

【问题讨论】:

  • 在哪里调用超时?

标签: javascript jquery angular settimeout


【解决方案1】:

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

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

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

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

或者

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

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

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

【讨论】:

  • 这是 Angular 2 中用于登录的 post 方法
  • 请编辑您的问题并在此处添加代码。 cmets 中的代码不可读。我想知道的是调用代码相对于被调用代码在哪里(同一个类,其他类,其他类是如何得到函数的引用的)
  • setTimeout(() => this.logout(), 1000);这就是我所需要的!谢谢
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    setTimeout 将函数调用添加到事件循环并从那里触发它。 所以this 丢失并设置为window(默认)。您必须将 this 绑定到您的函数。

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

    【讨论】:

      【解决方案4】:

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

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

      第二种解决方案是将注销声明为变量,这样您在调用它时就不会丢失上下文:

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

      然后你这样称呼它:

      setTimeout(this.logout, 1000);
      

      【讨论】:

        猜你喜欢
        • 2021-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 2021-01-16
        相关资源
        最近更新 更多