为何Angular根服务ImportExportService的构造函数未执行?
问题:Angular根服务ImportExportService构造函数未执行的原因?
涉及的两个根服务代码
Service 1: DataService
@Injectable({ providedIn: 'root', }) export class DataService { private data$ = new BehaviorSubject([]); public dataObs$ = this.data$.asObservable(); constructor(private http: HttpClient) {} setData(data: any) { this.data$.next(data); } loadData(url: string, category: number) { return this.http.get(`${url}?chapter=${category}`); } }
Service 2: ImportExportService
@Injectable({ providedIn: 'root', }) export class ImportExportService { private data$: Observable<any>; constructor(private dataService: DataService) { this.data$ = this.dataService.dataObs$; this.data$.subscribe((e) => console.log(e)); alert('Done'); } }
问题描述:两个服务均通过providedIn: 'root'注册为根服务,但ImportExportService的构造函数未执行,无法弹出alert('Done')提示,请问原因是什么?
原因分析
Angular根服务的懒初始化机制:使用
providedIn: 'root'注册的根服务采用懒加载初始化策略——只有当该服务被其他已经初始化的组件、服务或指令注入时,Angular才会创建它的实例并执行构造函数。如果你的应用中没有任何地方声明依赖ImportExportService(比如没有组件/服务的构造函数里写private importExportService: ImportExportService),Angular不会主动实例化这个服务,构造函数里的代码自然不会执行。依赖链的单向性:虽然
ImportExportService依赖DataService,但这个依赖关系是单向的。DataService的初始化只会被它的依赖者触发,而不会反过来触发ImportExportService的初始化——只有当某个已激活的模块/组件/服务依赖ImportExportService时,才会触发它的实例化,连带初始化它依赖的DataService。验证方法:你可以在任意活跃的组件构造函数中注入
ImportExportService,比如:
// 在某个组件的构造函数中添加 constructor(private importExportService: ImportExportService) {}
当这个组件初始化时,ImportExportService的实例会被创建,构造函数里的alert('Done')就会正常触发。
内容的提问来源于stack exchange,提问作者Gamov
相关产品推荐
相关产品推荐

