2016-09-29 10 views
0

私はobservableを使ってプロバイダにopaquetokenを設定しようとしています。理由は、私はHTTPプロバイダ(外部JSONファイル)を介して値を読んでいる。ObaqueTokenをオブザーバブルで設定することはできますか?

これは私が明らかにこの文句を言わない作業を

{ 
     provide: SOME_OPAQUE_TOKEN, 
     useFactory: (configService: ConfigService) => { 
      configService.getPath('campaigns') 
       .subscribe((res) => { 
        ??? 
       }); 
     }, 
     deps: [ConfigService], 
    }, 

をやろうとしているが、この種の問題のための解決策がある場合、私は思ったんだけど何ですか?

実際にパラメータの1つが非同期に取得されるuseFactoryを使用してサービスを構築することが実際に可能な場合。

それはまったく可能ですか?

編集:ソリューションAppModuleでAPP_INITIALIZER

を使用して:ConfigService負荷で

{ 
    provide: APP_INITIALIZER, 
    useFactory: (configService: ConfigService) =>() => configService.load(), 
    multi: true, 
    deps: [ConfigService, Http], 
}, 

():

public load(): Promise<Configuration> { 
    let promise = 
     this.http 
      .get('config.json') 
      .map(m => m.json()) 
      .toPromise(); 

    promise 
     .then(config => this.appConfig = config); 

    return promise; 
} 

我々はのAppConfigを設定すると、我々が設定し、それを使用することができます不透明トークン:

{ 
     provide: BASE_PATH, 
     useFactory: (configService: ConfigService) => configService.appConfig.basePath, deps: [ConfigService], 
    }, 
+0

あなたはアプリが初期化される前に、依存関係を解決する必要があります。私は[APP_INITIALIZER](https://stackoverflow.com/search?q=app_initializer)が役立つと思います。 – estus

+0

ありがとう@estusは、これが使われている例がありますか? – Yodacheese

+0

まだ参照できません。あなたは検索を使用することができます.SOにはAPP_INITIALIZERをカバーするたくさんの質問があります。 http://stackoverflow.com/a/38128065/3731501。 – estus

答えて

2

APP_INITIALIZER文書化されていないマルチプロバイダは、アプリケーションの依存関係を非同期的に解決するために使用されるはずです。

イニシャライザは、約束(非同期初期化用)またはその他の値(同期初期化用)を返す関数であると考えられます。 APP_INITIALIZERはマルチプロバイダであるため、多くのイニシャライザが存在する可能性があります。これらは並行して実行され、待たれます。実装はhereです。

これは、モジュール内のプロバイダとして定義することができます

{ 
    provide: APP_INITIALIZER, 
    useFactory: (...deps...) =>() => promise, 
    deps: [...deps...], 
    multi: true 
} 

や依存関係のない初期化のために:

{ 
    provide: APP_INITIALIZER, 
    useValue:() => promise, 
    multi: true 
} 
関連する問題