Сколько раз запускается конструктор сервиса?
Всегда считал, что если объявить сервис на уровне главного модуля приложения и добавить к нему providedIn: 'root', то данный клас принимается приложением как синглтон и инициируется единожды. Т.е. конструктор данного класса запустится 1 раз на протяжении жизни приложения. Но при реализации сервиса SettingService, который должен кормить все приложение глобальными настройками получилась какая-то чушь.
@Injectable({ providedIn: 'root' }) export class SettingService { constructor() { console.log("Go!"); } } В этом случае, как и предполагалось, в консоль будет выведено Go! 1 раз. Но, если изменить конструктор так: constructor( private http: HttpClient, private $MSG: MsgList, public $NOTE: NotificationsService ) { const globalVars = new GlobalVars(); this.data = globalVars.cloneData(); console.log("Go!"); this.http.get<any[]>('http://api.com/preferenses') .subscribe( (data: any[]) => { console.log(data); }); } То надпись Go! выводится 272 раза. Вероятно имеется связь между количеством компонентов в приложении, которые подключают этот сервис и количеством вызовов. При этом понятно, что вызов бэка асинхронный и пойди пойми, чем занимается приложение, пока мы читаем данные. Тут 2 вопроса: 1. Почему меняется поведение конструктора. 2. Как синхронно прочитать данные с бэка из сервиса, чтобы приложение тормознуло, пока все не считается и потом работать с этими натройками. |
Цитата:
По второму пункту: обычно такие штуки как настройки приложения загружают до бутстрапа этого приложения. Для этого необходимо создать свою кастомную реализацию провайдера для APP_INITIALIZER токена. https://blog.zverit.com/frontend/201...ervice-method/ |
Провайдерм в каждом компоненте не объявлял.
providedIn: 'root' был добавлен от великой печали и расстройства. Думал, может что-то не так делаю. APP_INITIALIZER -- погуглил. Интересно. Буду копать в этом направлении. Классная штука Ангуояр. Сколько работаешь с ним, а все время найдется какая-то штука, о которой даже понятия не имеешь. Спасибо за подсказку. |
Часовой пояс GMT +3, время: 03:11. |