Angular ResolveFn中inject()报错:调整注入顺序为何能修复问题?
Angular函数式ResolveFn中inject()调用顺序导致注入上下文错误的原因
核心逻辑:inject()必须在同步注入上下文内执行
Angular的inject()函数有严格的执行时机限制:它只能在函数的同步执行阶段调用,一旦进入异步操作(比如await、Promise.then),当前代码就会脱离Angular为ResolveFn创建的注入上下文,此时再调用inject()就会触发报错。
报错代码的问题拆解
在报错的代码片段中:
await inject(PrepareAdHocReportingService).resolve(); const dashboardsService = inject(DashboardsService); // 此处已脱离注入上下文
- 第一行的
inject()本身是同步调用,能正常获取服务实例,但紧接着的await会挂起当前函数执行,后续代码会进入异步回调队列。 - 当
await完成后,inject(DashboardsService)是在异步回调中执行的,此时注入上下文已不存在,因此抛出inject() must be called from an injection context错误。
正常代码的工作原理
调整调用顺序后:
const dashboardsService = inject(DashboardsService); // 同步阶段调用,处于注入上下文内 await inject(PrepareAdHocReportingService).resolve();
- 所有
inject()调用都放在了await之前的同步执行阶段,此时仍处于Angular提供的注入上下文里,能正常获取服务实例;后续的异步操作仅使用已获取到的实例,不会触发注入上下文问题。
补充说明
无论服务是通过providedIn: 'root'还是其他方式提供,inject()的调用时机规则都是一致的。对于函数式Resolver、Guard等路由相关函数,所有依赖注入必须在函数的同步起始阶段完成,绝对不能放在异步操作之后。
内容的提问来源于stack exchange,提问作者Tina Rogers
相关产品推荐
相关产品推荐

