首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular APP_INITIALIZER

Angular APP_INITIALIZER
EN

Stack Overflow用户
提问于 2018-09-16 05:20:03
回答 2查看 1.2K关注 0票数 1

我刚接触Angular,目前正在使用Angular6进行开发。这是我的问题。在我的应用程序开始之前,我需要调用三个服务,它们为我提供了一些应用程序的配置。让我们将服务调用为Initialization、Conifg和UserDetails。所以我在app-module.ts文件中添加了服务,如下所示。

`

代码语言:javascript
复制
    export function init_app(initService: InitializationService) {
        return () => initService.getInit();
    }

    export function get_settings(configService: ConfigService) {
        return () => configService.getConfig();
    }
export function get_user_settings(userDetails: UserDetailsService) {
        return () => userDetails.getSettings();
    }

    @NgModule({
      imports: [/*my-imports*/],
      providers: [
        AppLoadService,
        { provide: APP_INITIALIZER, useFactory: init_app, deps: [InitializationService], multi: true },
        { provide: APP_INITIALIZER, useFactory: get_settings, deps: [ConfigService], multi: true },
        { provide: APP_INITIALIZER, useFactory: get_user_settings, deps: [UserDetailsService], multi: true }
      ]
    })

`现在InitializationService有了其他两个服务正常工作所需的一些值。在app_init中,服务请求被立即发送。

我需要仅在完成对InitializationService的调用时才调用我的ConfigService和UserDetailsService。

为了解决这个问题,我做了以下工作:

// AppConfig.ts

代码语言:javascript
复制
export class AppConfig {
  public static Config= {};

  public static $subject = new Subject();
}

// InitializationService

代码语言:javascript
复制
getInit () {

const promise = new Promise((resolve, reject) => {
      this.http.get().then(val => {
        AppConfig.config = val;
        AppConfig.$subject.next(val);
      });
};

return promise;
}

//ConfigService

代码语言:javascript
复制
getConfig () {
 if(AppConfig.Config.baseUrl === undefined) {
   AppConfig.$subject.subscribe(val => {
     this.http.get(AppConfig.Config.baseUrl).then(//doSomething);
   })
 }
}

所以我创建了一个静态主题并订阅了它。一旦Init服务完成,它将发送主题的下一个值,该值现在由Config服务订阅和侦听。一旦接收到subscribe调用,我就进行进一步的操作。

我的UserDetails getSettings()调用重复了相同的代码。

我的方法正确吗?是否有任何其他模式尝试和测试。

有什么建议或更好的方法来解决上面的问题吗?

提前谢谢。

你好,霍克斯

EN

回答 2

Stack Overflow用户

发布于 2018-09-16 05:31:01

使用一个初始化器并在那里控制整个流程:

代码语言:javascript
复制
export function initAll(initService: InitializationService, configService: ConfigService, userDetails: UserDetailsService) {
  return () => {
    return initService.getInit().pipe(
      switchMap(() => {
        return flatMap([ConfigService.getConfig(), userDetails.getSettings()]);
      }),
    );
  }
}

请注意,flatMap假设这两个操作都要完成;然而,这只是一种方法。您可以完全控制rxjs操作符的进程。而且,您只有一个APP_INITIALIZER

票数 2
EN

Stack Overflow用户

发布于 2018-09-17 21:35:58

//app-module代码

代码语言:javascript
复制
export function initAll(appInitService:AppInitService, configService:ConfigService) {
  // return a promise because thats what the app_init token expects. there is an open ticket with angular related to this. https://github.com/angular/angular/issues/15088
  return () => {
    const promise = new Promise((resolve, reject) => {
      appInitService.load().then(() => {
        configService.fetch().then(() => {
          resolve();
        });
      });
    });
    return promise;
  }
}

//appInitService.load()调用

代码语言:javascript
复制
const promise = this.http.get<any>(`myConfigURL`).toPromise();
promise.then(response => {
 Object.assign(AppConfig.ENV, response.value.parameters);
});
return promise;

// config服务调用

代码语言:javascript
复制
const promise = this.http.get<any>(myConfigUrl).toPromise();
promise.then(response => {
  //do something with response
});
return promise;

我采用这种方法是因为它解决了我拥有和维护主题的问题。另外,我没有时间去尝试和调试可观察到的东西出了什么问题。

不过,还是要感谢你的回复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52348971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档