2016-09-29 5 views
0

Ich versuche, ein Opaquetoken in den Anbietern mit einer beobachtbaren setzen. Grund ist, dass ich den Wert über den HTTP-Provider (externe JSON-Datei) lese.Ist es möglich, ein OpaqueToken über ein Observable zu setzen?

Das ist, was ich versuche

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

So offensichtlich diese nicht funktionieren zu tun, aber ich frage mich, ob es eine Lösung für diese Art von Problem?

Oder wenn es tatsächlich möglich ist, einen Service mit UseFactory zu konstruieren, wo einer Ihrer Parameter asynchron abgerufen wird.

Ist das überhaupt möglich?

Edit: Lösung APP_INITIALIZER mit

In AppModule:

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

In ConfigService load():

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

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

    return promise; 
} 

Sobald wir die appconfig setzen wir können es verwenden, die festlegen OpakToken:

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

Sie müssen die Abhängigkeit, bevor die App beheben initialisiert werden. Ich denke, dass [APP_INITIALIZER] (https://stackoverflow.com/search?q=app_initializer) hilft. – estus

+0

Danke @estus, gibt es ein Beispiel, wo dies verwendet wird? – Yodacheese

+0

Es ist noch nicht durch die Referenz abgedeckt. Sie können die Suche verwenden, es gibt eine Menge von beantworteten Fragen zu SO, die APP_INITIALIZER abdecken, z. http://stackoverflow.com/a/38128065/3731501. – estus

Antwort

2

APP_INITIALIZER undokumentierter Multi-Provider soll verwendet werden, um App-Abhängigkeiten asynchron zu lösen.

Ein Initialisierer soll eine Funktion sein, die eine Zusage (für asynchrone Initialisierung) oder einen anderen Wert (für die Synchronisierungsinitialisierung) zurückgibt. Da APP_INITIALIZER Multi-Provider ist, kann es viele Initialisierer geben, die parallel ausgeführt und abgewartet werden. Die Implementierung ist here.

Es kann als Anbieterin im Modul definiert werden:

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

Oder für eine Initialisierung ohne Abhängigkeiten:

{ 
    provide: APP_INITIALIZER, 
    useValue:() => promise, 
    multi: true 
} 
Verwandte Themen