2016-03-06 65 views
15

我想通过使用setInterval()每10分钟调用一个函数,并且在此函数中我想使用从Dependency获得的Service(称为auth)角2的注射器,问题是,控制台告诉我下面的:Angular 2 call setInterval()undefined服务形式依赖注入

EXCEPTION: TypeError: this.auth is undefined

constructor(private auth: AuthService){ 
    setInterval(function(){ this.auth.refreshToken(); }, 1000 * 60 * 10); 
    } 
+1

'的setInterval(()=> this.auth.refreshToken(),1000 * 60 * 10);' –

回答

38

在给setInterval的时候它被称为不指向类的功能。

改为使用箭头功能。

constructor(private auth: AuthService){ 
    setInterval(() => { this.auth.refreshToken(); }, 1000 * 60 * 10); 
    } 
+3

优秀交关于这一主题这里:http://www.2ality.com/2012/04/arrow-functions.html –

2

此问题的full discussion可以为setInterval()方法的文档中找到,标题“此”问题。大约在页面的一半。

jist是它是“this”变量发生变化的结果。传递给setInterval()函数的函数从类上下文中提取并放入setInterval()(窗口)的上下文中。所以,它是不​​确定的。

这个问题有几种解决方案。上述toskv提出的方法是一种相当普遍的方法。 另一种解决方案是使用bind()方法。

constructor(private auth: AuthService) { 
    setInterval(this.auth.refreshToken.bind(this), 1000 * 60 * 10); 
} 

参考资料来自this question,由Pointy回答。

bind() method的文档。

关于javascript scope的好文章,它仍然可以在打字稿中回来咬你。

0

解决这个问题有一个小技巧。希望这可以帮助。

首先做

const this1 = this; 

然后

constructor(private auth: AuthService) { 
    setInterval(this1.auth.refreshToken.bind(this), 1000 * 60 * 10); 
}