Angular ресурсы и аутентификация через заголовки.
Вот вам интересная ситуация, с которой столкнулся на днях. Она скорее не столько про ангуляр или про аутентификацию сколько про базовые знания JS и умение их применять.
Диспозиция такая — нужно организовать работу с API, аутентификация происходит по заголовку HTTP, токен для аутентификации может меняться по ходу выполнения приложения.
Проблемы тут следующие:
- У нас есть момент инициализации приложения в этот момент регистрируются все ресурсы, но токен аутентификации может изменится позже.
- Мы хотим быть хорошими разработчиками и не писать монстров ловко перебирающих костылями.
В общем не мудрствуя лукаво вот спойлер для тех, кто хочет поскорее узнать решение:
Can’t show view1
Просто, не так-ли? На самом деле простота тут обманчива, кто-то по незнанию может случайно написать такое решение, впрочем давайте начну с начала. Изначально программа была такой:
Can’t show view1
Проблема возникла позже, когда мне пришлось ввести контроллер который должен быть инициализирован до получения токена. Что происходило? Фабрика срабатывала в момент, когда значение accessTokenGlobal
еще не было задано и при повторной перезагрузки контроллера значение, разумеется сохранялось так как фабрика для синглтона запускается единожды.
В нормальных языках это решается указателями, но мы-же в JavaScript тут указатели все и ничего одновременно (хвала Прототипно-ориентированному программированию). Действительно, любая переменная в JS является указателем, но не указателем на указатель а именно указателем на память. т.е. каждая новая переменная просто копирует значение присваемого указателя, но является по сути новым указателем.>
На примере это выглядит так:
var A = 'a';
var B = A;
A = 'b';
Таким образом изменение значения переменной A не является изменением переменной B, хотя и первое и второе является указателем. Посему вариант кода с указателями первого уровня нам не подойдет. Но, что будет если мы проделаем все то-же самое с объектом имеющим параметр. У нас есть 2 объекта A и B, ссылающихся на один и тот-же участок памяти. У объекта есть атрибут, который тоже по сути указатель но уже на строку. При изменении атрибута оба указателя остаются не тронутыми. Отсюда вариант с Authorization: accessTokenGlobal тоже не сработает, так как он по сути является частным случаем начального варианта программы. При попытки присвоить accessTokenGlobal
новое значение он указывает на новый объект в памяти, а нас такой вариант не устраивает.
В общем-то в сложившейся ситуации нет ничего сверхестественного, но и случай достаточно не тривиальный. Не смотря на всю кажущуюся простоту задачи решением я смог найти только костыли. Данным примером я хотел показать насколько важно знать основы языка и помнить о принципах работы памяти для решения настолько казалось-бы далеких от базового уровня проблем. А так-же помните что даже работая со скриптовыми и слабо-типизированными языками вам не следует забывать о наличии типов и памяти.