Angular中inject函数结合APP_INITIALIZER使用报错原因咨询
Angular中APP_INITIALIZER使用inject函数报错的原因及解决方法
你遇到的NG0203错误,核心问题是**inject函数的调用时机不对**:
- 你写的代码里,
useFactory返回了一个嵌套的箭头函数,inject(Engine)是在这个嵌套函数里调用的,而不是在工厂函数本身的执行阶段。 - Angular的
inject函数必须在注入上下文活跃时调用——也就是工厂函数执行的那个时刻。而APP_INITIALIZER返回的嵌套函数,是在应用初始化阶段才会被执行,这时候原来的注入上下文已经不存在了,自然会触发错误。
正确的写法
要解决这个问题,只需把inject的调用移到工厂函数内部,提前获取依赖实例,再让返回的初始化函数直接使用这个实例:
providers: [ { provide: APP_INITIALIZER, useFactory: () => { // 工厂函数执行阶段处于注入上下文,可安全调用inject const engine = inject(Engine); // 返回的初始化函数直接使用提前拿到的实例 return () => engine.start(); }, multi: true } ]
为什么Car的工厂函数没问题?
之前的Car提供者示例能正常工作,是因为inject是在工厂函数的执行过程中直接调用的,整个逻辑都处于Angular的注入上下文里,完成依赖获取后直接返回Car实例,没有延迟到后续脱离上下文的时机执行。
内容的提问来源于stack exchange,提问作者Mikkel R. Lund
相关产品推荐
相关产品推荐

