多提供商的订单如何在angular4中工作?

时间:2018-09-03 07:52:13

标签: angular

在我现有的angular4应用程序app.module.ts中,我具有以下APP_INITIALIZER提供程序:

{
    provide: APP_INITIALIZER,
    useFactory: (config: AntiforgeryService) => () => config.Load(),
    deps: [AntiforgeryService, GlobalService],
    multi: true
},

{
    provide: HTTP_INTERCEPTORS,
    useClass: RebarInterceptor,
    multi: true
},
{
    provide: ErrorHandler,
    useClass: GlobalExceptionHandler
}

此后,我有一个要求,我必须在所有HTTP调用中传递一些令牌。因此,我必须先调用AntiforgeryService的load方法。因此,我决定将此负载作为提供者,如下所示:

{
    provide: APP_INITIALIZER,
    useFactory: (config: AppConfig) => () => config.load(),
    deps: [AppConfig],
    multi: true
},      
{
    provide: APP_INITIALIZER,
    useFactory: (config: AntiforgeryService) => () => config.Load(),
    deps: [AntiforgeryService, GlobalService],
    multi: true
},
{
    provide: HTTP_INTERCEPTORS,
    useClass: RebarInterceptor,
    multi: true
},
{
    provide: ErrorHandler,
    useClass: GlobalExceptionHandler
}

输入此内容后,控制台出现错误: 发生了一些错误。错误:未捕获(承诺):TypeError:无法读取null的属性“ eso” TypeError:无法读取null的属性'eso'

我有一个config.json文件,其中有此“ eso”属性,正在使用上述提供程序(AppConfig)加载该文件。

有人可以建议,如上所述,提供商部分是否有任何订单问题?还是存在多标志问题?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我想您的AntiforgeryService使用AppConfig中的eso属性。 APP_INITILAIZER方法可以同时运行。我的建议是做一个大的初始化器:

{
    provide: APP_INITIALIZER,
    useFactory: loadConfigs,
    deps: [AppConfig, AntiforgeryService],
    multi: true
},

并创建了这样的导出函数:(导出否则AOT无效)

export const loadConfigs = (app: AppConfig, af: AntiforgeryService) => {
  return app.load().then(() => af.load());
};