Angular — локальная переменная класса перехватчика, не отражающая изменения внутри функции перехвата

#angular #frontend #interceptor #angular-services

#angular #интерфейс #перехватчик #angular-сервисы

Вопрос:

Мой класс intercept имеет токен в качестве локальной переменной. введите описание изображения здесь

У меня есть функция autoLogin() в том же файле (перехватчик)

введите описание изображения здесь

Этот автоЛогин вызывается в ngOnInit из app.component.ts.

Это мой перехват.

введите описание изображения здесь

Обратите внимание на строку 21, вывод токена на консоль.

Проблема: поскольку функция autoLogin вызывается первой, токен из локального хранилища присваивается токену локальной переменной. (напечатано в строке 94). Таким образом, печать в строке 21, которая вызывается после autoLogin, должна печатать токен, но он печатает » (пустая строка, инициализированное значение).

Вывод
введите описание изображения здесь

Примечание: выполнено 3 HTTP-вызова.

Комментарии:

1. Является ли ваш перехватчик одноэлементным? Кроме того, существует ли другой путь к коду, который изменит token ?

2. Для параметра Multi в providers установлено значение true. Токен используется только внутри класса перехватчика, нигде снаружи.

3. Цитирую официальный документ : If you import HttpClientModule multiple times across different modules (for example, in lazy loading modules), each import creates a new copy of the HttpClientModule, which overwrites the interceptors provided in the root module. так что, скорее всего, ваши перехватчики — это разные экземпляры. Вы можете либо использовать метод, предложенный в документе, для использования общего единственного экземпляра, либо внедрить другую службу для хранения состояния токена. Лично я считаю, что последнее проще.