Angular 2 call setInterval() undefined Форма обслуживания Зависимость впрыска

Я хочу вызвать функцию каждые 10 минут, используя setInterval(), и в этой функции я хочу использовать Сервис (называемый auth), который я получаю от Injector Dependency от Angular 2, проблема в том, что консоль говорит мне следующее:

ИСКЛЮЧЕНИЕ: TypeError: this.auth undefined

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

Ответы

Ответ 1

этот в функции, заданной setInterval, не указывает на класс, когда он вызывается.

Вместо этого используйте функцию стрелки.

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

Ответ 2

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.

Ответ 3

Там есть небольшой трюк для решения этого. Надеюсь, это поможет.

Сначала сделайте

const this1 = this;

затем

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