Ответ 1
этот в функции, заданной setInterval, не указывает на класс, когда он вызывается.
Вместо этого используйте функцию стрелки.
constructor(private auth: AuthService){
setInterval(() => { this.auth.refreshToken(); }, 1000 * 60 * 10);
}
Я хочу вызвать функцию каждые 10 минут, используя setInterval(), и в этой функции я хочу использовать Сервис (называемый auth), который я получаю от Injector Dependency от Angular 2, проблема в том, что консоль говорит мне следующее:
ИСКЛЮЧЕНИЕ: TypeError: this.auth undefined
constructor(private auth: AuthService){
setInterval(function(){ this.auth.refreshToken(); }, 1000 * 60 * 10);
}
этот в функции, заданной setInterval, не указывает на класс, когда он вызывается.
Вместо этого используйте функцию стрелки.
constructor(private auth: AuthService){
setInterval(() => { this.auth.refreshToken(); }, 1000 * 60 * 10);
}
A полное обсуждение этой проблемы можно найти в документации для метода setInterval(), под заголовком "this" Проблема. Примерно на полпути вниз.
Суть заключается в том, что это результат изменения переменной "this". Функция, передаваемая в функцию setInterval(), извлекается из контекста класса и помещается в контекст setInterval() (окно). Таким образом, это undefined.
Есть несколько решений этой проблемы. Метод, предложенный выше toskv, является довольно распространенным подходом. Другим решением является использование метода bind().
constructor(private auth: AuthService) {
setInterval(this.auth.refreshToken.bind(this), 1000 * 60 * 10);
}
Справочный материал из этого вопроса, ответьте Pointy.
Документация для метода bind().
Хорошая статья о javascript scope, которая все еще может вернуться, чтобы укусить вас в typescript.
Там есть небольшой трюк для решения этого. Надеюсь, это поможет.
Сначала сделайте
const this1 = this;
затем
constructor(private auth: AuthService) {
setInterval(this1.auth.refreshToken.bind(this), 1000 * 60 * 10);
}