多个角度应用初始化器

mes*_*ati 12 angular

我们知道在根模块提供程序中,我们可以APP_INITIALIZER在后端设置引导某些依赖项,然后加载第一个组件

{
    provide: APP_INITIALIZER,
    useFactory: configLoader,
    multi: true,
    deps: [ConfigService]
}
Run Code Online (Sandbox Code Playgroud)

我将以上述方式在应用程序启动之前加载我的用户配置,但我想做更多的事情,比如在我的应用程序启动之前连接websocket.

我知道我可以在configLoader我编写的函数中执行,首先加载配置然后在该configLoader函数中连接websocket,但由于某些原因,我现在不能这样做,所以我需要在某种程度上这样做:

{
    provide: APP_INITIALIZER,
    useFactory: [configLoader, websocketLoader],
    multi: true,
    deps: [ConfigService, WebsocketService]
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是,它不会起作用.那么有没有办法加载多个应用程序初始化程序?

Gün*_*uer 13

useFactory 不应该是一个数组

{
    provide: APP_INITIALIZER,
    useFactory: websocketLoader,
    multi: true,
    deps: [ConfigService, WebsocketService]
},
{
    provide: APP_INITIALIZER,
    useFactory: configLoader,
    multi: true,
    deps: [ConfigService, WebsocketService]
}
Run Code Online (Sandbox Code Playgroud)

通过multi: true为多个提供者提供相同的键(APP_INITIALIZER)不会覆盖前一个(行为multi: false),但DI将在数组本身中收集它们.

  • 不,你不能定义一个订单,但是你可以注册一个注入`ConfigService`和`WebSocketService`的第三个工厂,在第一个工厂调用初始化方法,当完成时调用另一个的初始化方法(你需要将初始化代码从构造函数移动到工厂显式调用它们的方法. (3认同)
  • 谢谢,这可行,但是我们可以为这些初始化程序定义命令吗?像configLoader完全加载,然后websocketLoader启动? (2认同)