You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Angular新的provideAppInitializer中结合依赖使用useFactory?

使用 Angular 的 provideAppInitializer 实现服务顺序初始化

问题描述

我需要按顺序初始化 StorageService 和 SessionService,完成后用户才能进入应用。原来基于 APP_INITIALIZER 的实现代码如下:

export function initApp(
  storage: StorageService,
  session: SessionService,
) {
  return async () => {
    await firstValueFrom(
      storage.initialized$.pipe(
        filter((event) => (event ? true : false)),
        take(1),
      ),
    )

    await firstValueFrom(
      session.initialized$.pipe(
        filter((event) => (event ? true : false)),
        take(1),
      ),
    )
  }
}

之前的配置方式:

{
  provide: APP_INITIALIZER,
  useFactory: initApp,
  deps: [StorageService, SessionService],
  multi: true,
},

但切换到最新的 provideAppInitializer API 后,我不清楚如何传入依赖。Angular 官方示例是这样的:

provideAppInitializer(() => {
  const initializerFn = ((service: Service) => {
    return () => service.init();
  })(inject(Service));
  return initializerFn();
});

请问该如何适配我的顺序初始化需求?

解决方案

你可以直接在 provideAppInitializer 的回调函数中使用 inject() 方法获取所需服务,无需额外配置依赖。以下是两种可行的实现方式:

方式一:直接在回调内编写初始化逻辑

provideAppInitializer(() => {
  // 直接注入所需服务
  const storage = inject(StorageService);
  const session = inject(SessionService);

  // 保留原有的顺序初始化逻辑
  return async () => {
    await firstValueFrom(
      storage.initialized$.pipe(
        filter(event => !!event),
        take(1)
      )
    );

    await firstValueFrom(
      session.initialized$.pipe(
        filter(event => !!event),
        take(1)
      )
    );
  };
})

方式二:改造原有初始化函数适配新 API

调整 initApp 函数,让它在注入上下文内获取依赖:

export function initApp() {
  const storage = inject(StorageService);
  const session = inject(SessionService);

  return async () => {
    await firstValueFrom(
      storage.initialized$.pipe(
        filter(event => !!event),
        take(1)
      )
    );

    await firstValueFrom(
      session.initialized$.pipe(
        filter(event => !!event),
        take(1)
      )
    );
  };
}

// 在 providers 中使用
provideAppInitializer(initApp)

核心说明

provideAppInitializer 的回调函数运行在 Angular 的注入上下文环境中,因此可以直接调用 inject() 来获取任何已注册的服务,替代了旧 API 中 deps 数组的作用。两种方式都能保证先等待 StorageService 初始化完成,再等待 SessionService 初始化完成,符合你的业务需求。

内容的提问来源于stack exchange,提问作者Raphaël Balet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:10:09