Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Сколько раз запускается конструктор сервиса? (https://javascript.ru/forum/angular/79177-skolko-raz-zapuskaetsya-konstruktor-servisa.html)

sniffysko 30.12.2019 01:04

Сколько раз запускается конструктор сервиса?
 
Всегда считал, что если объявить сервис на уровне главного модуля приложения и добавить к нему 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. Как синхронно прочитать данные с бэка из сервиса, чтобы приложение тормознуло, пока все не считается и потом работать с этими натройками.

destus 30.12.2019 08:11

Цитата:

если объявить сервис на уровне главного модуля приложения и добавить к нему providedIn: 'root',
Меня пугает что вы использовали союз "и", а уместнее было бы "или". То есть либо provideIn, либо сами пишем в providers ангуляр модуля. По первому пункту из приведенного кода не ясно почему происходит такое поведение. Проверьте, не объявляете ли вы этот сервис в providers каждого компонента отдельно.
По второму пункту: обычно такие штуки как настройки приложения загружают до бутстрапа этого приложения. Для этого необходимо создать свою кастомную реализацию провайдера для APP_INITIALIZER токена.
https://blog.zverit.com/frontend/201...ervice-method/

sniffysko 30.12.2019 13:15

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


Часовой пояс GMT +3, время: 02:25.