2016-03-19 10 views
1

Ich möchte eine http.get Methode aus meinem ThemeService aufrufen und es so "synchron" wie möglich machen, so dass es fortlaufend, nachdem es Theme aus dem Anruf erhält. Ich suchte, wie man das macht und stolperte über async und await. Ich habe versucht, dies zu implementieren, aber es hat nicht ganz funktioniert. Ich habe console.log() in den Code geschrieben, damit ich sehen kann, was ist und was nicht ausgeführt wird. Die "IN ASYNC FUNCTION" und "AFTER ASYNC" werden ausgeführt, aber nicht die nach/in meinem Anruf unter ThemeService.So verwenden Sie async/erwarten in Typoskript

Da ich neu bin zu den async/await Funktionen in Typoskript Ich weiß nicht, ob was ich geschrieben habe, ist schlecht oder wenn was ich versuche zu tun ist möglich oder nicht.

ngOnInit():void{ 
    let id = +this.routeParams.get('themeId'); 
    async function getTheme(){ 
     console.log("IN ASYNC FUNCTION"); 
     var val = await this.themeService.getTheme(id).subscribe((theme:Theme)=> { 
      this.theme = theme; 
      console.log("IN AWAIT FUNCTION") 
     }); 
     console.log("AFTER AWAIT"); 
     return val; 
    } 

    getTheme(); 
    console.log("AFTER ASYNC"); 
} 

Antwort

3

Sie können es so haben (beachten Sie Nutzung von 'nehmen (1) .toPromise()'):

ngOnInit():void 
{ 
    let id = +this.routeParams.get('themeId'); 
    async function getTheme() 
    { 
     console.log("IN ASYNC FUNCTION"); 
     var val = await this.themeService.getTheme(id).take(1).toPromise(); 
     console.log("AFTER AWAIT"); 
     return val; 
    } 

    this.theme = await getTheme(); 
    console.log("AFTER ASYNC"); 
} 

Oder etwas kürzer:

class MyComponent implements OnInit 
{ 
    async ngOnInit() 
    { 
     let id = +this.routeParams.get('themeId'); 
     this.theme = await this.themeService.getTheme(id).take(1).toPromise(); 
     console.log("AFTER ASYNC"); 
    } 
} 

Hope Diese hilft.

+0

Ich habe es in beide Richtungen versucht, aber nichts hat geklappt, 'this.theme' hat keinen Wert bekommen. Der "AFTER ASYNC" ist nicht in der Konsole angemeldet. Wenn ich eine 'console.log (" int method ")' innerhalb der Methode 'getTheme()' setze, protokolliert sie es nicht in der Konsole – Kupi

+0

versuche zuerst deine themeService.getTheme() async Methode mit einer Dummy Methode zu ersetzen das protokolliert nur, wenn es aufgerufen wird, und gibt etwas wie Promise.resolve() zurück, um zu sehen, dass es nicht das Problem mit themeService ist. – Amid

+0

Ich änderte den Inhalt von 'getTheme', um nur etwas in der Konsole zu protokollieren und Promise.resolve() anstelle von Observable zurückgeben und das funktioniert. Aber die getTheme-Methode funktioniert, wenn ich sie normalerweise anstelle von async/await verwende. – Kupi