Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.12.2019, 01:04
Аспирант
Отправить личное сообщение для sniffysko Посмотреть профиль Найти все сообщения от sniffysko
 
Регистрация: 20.10.2009
Сообщений: 79

Сколько раз запускается конструктор сервиса?
Всегда считал, что если объявить сервис на уровне главного модуля приложения и добавить к нему 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. Как синхронно прочитать данные с бэка из сервиса, чтобы приложение тормознуло, пока все не считается и потом работать с этими натройками.
Ответить с цитированием
  #2 (permalink)  
Старый 30.12.2019, 08:11
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Цитата:
если объявить сервис на уровне главного модуля приложения и добавить к нему providedIn: 'root',
Меня пугает что вы использовали союз "и", а уместнее было бы "или". То есть либо provideIn, либо сами пишем в providers ангуляр модуля. По первому пункту из приведенного кода не ясно почему происходит такое поведение. Проверьте, не объявляете ли вы этот сервис в providers каждого компонента отдельно.
По второму пункту: обычно такие штуки как настройки приложения загружают до бутстрапа этого приложения. Для этого необходимо создать свою кастомную реализацию провайдера для APP_INITIALIZER токена.
https://blog.zverit.com/frontend/201...ervice-method/
Ответить с цитированием
  #3 (permalink)  
Старый 30.12.2019, 13:15
Аспирант
Отправить личное сообщение для sniffysko Посмотреть профиль Найти все сообщения от sniffysko
 
Регистрация: 20.10.2009
Сообщений: 79

Провайдерм в каждом компоненте не объявлял.
providedIn: 'root' был добавлен от великой печали и расстройства. Думал, может что-то не так делаю.
APP_INITIALIZER -- погуглил. Интересно. Буду копать в этом направлении.
Классная штука Ангуояр. Сколько работаешь с ним, а все время найдется какая-то штука, о которой даже понятия не имеешь.
Спасибо за подсказку.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получая числовое значение, нужно узнать сколько раз оно было минусов или плюсовым Ketlller Общие вопросы Javascript 27 11.12.2019 05:00
Alert срабатыевает столько раз, сколько закрыл popup. Почему? doox911 Events/DOM/Window 2 17.10.2018 13:26
В каком направлении и сколько раз был прокручен скролл webrepa Events/DOM/Window 19 12.02.2016 14:45
Контроллер запускается несколько раз при загрузке страницы tayrin Angular.js 4 15.07.2014 08:29
Определить сколько раз страница прокручена до конца. dolte Events/DOM/Window 1 19.09.2013 22:21