多个提供商的顺序如何在angular4中运行?

问题描述 投票:0回答:1

在我现有的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的加载方法。所以我决定把这个负载作为下面的提供者:

{
    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
}

放完之后,我在控制台中收到一些错误:发生了一些错误。错误:未捕获(在promise中):TypeError:无法读取null的属性'eso'TypeError:无法读取null的属性'eso'

我有一个config.json文件,我有这个'eso'属性,我使用上面的提供程序(AppConfig)加载。

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

任何帮助将不胜感激。

angular
1个回答
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());
};
© www.soinside.com 2019 - 2024. All rights reserved.