2016-09-14 9 views
5

Jeśli wywołać funkcję w ngOnInit(), która wywołuje dające się zaobserwować wywołanie, aby uzyskać dane, czy to this.getSomething() wywołanie w ngOnInit nadal asynchronizuje, czy też ngOnInit czekać, aż this.getSomething() zwróci wynik? Zasadniczo robi się "doSomethingElse" w ngOnInit() przed lub po tym terminie.getSomething() kończy?Czy wywołanie funkcji na asynchronizuje ngOnInit?

ngOnInit() { 
    this.getSomething(); 
    doSomethingElse; 
} 

getSomething() { 
    this.someService.getData() 
     .subscribe(
      result => { 
       this.result = result; 
      }, 
    error => this.errorMessage = <any>error); 
} 

Odpowiedz

9

ngOnInit() sam w sobie nie czeka na połączenia asynchroniczne. Możesz samodzielnie kodować łańcuch tak, jak wykonuje on tylko po zakończeniu połączenia asynchronicznego.

Na przykład to, co umieści się wewnątrz subscribe(...), zostanie wykonane po nadejściu danych.

Kod przychodzący po subscribe(...) jest wykonywany natychmiast (przed zakończeniem wywołania asynchronicznego).

Istnieje kilka haków cyklu życia routera, które czekają na zwrócone obietnice lub obserwowalne, ale żaden z haków cyklu składnika lub dyrektywy nie działa.

aktualizacja

Aby zapewnić kod jest wykonywany po this.getSomething() gdy getData() zakończeniu zmienić kod do

ngOnInit() { 
    this.getSomething() 
    .subscribe(result => { 
     // code to execute after the response arrived comes here 
    }); 
} 

getSomething() { 
    return this.someService.getData() // add `return` 
     .map(// change to `map` 
      result => { 
       this.result = result; 
      }, 
    // error => this.errorMessage = <any>error); // doesn't work with `map` 
    // (could be added to `catch(...)` 
} 
+0

Dzięki Gunter. Ale jeśli mam kod po wywołaniu this.getSomething() w ngOnInit, czy ten kod zostanie wykonany PO zakończeniu kodu w getSomething()? – Felix

+0

Nie, to (prawdopodobnie) zostanie wykonane przed zakończeniem wywołania 'http' w' getSomething'. – rinukkusu

+0

@Felix Zaktualizowałem swoją odpowiedź. Mam nadzieję, że stanie się to bardziej jasne. –