Powód:
Powodem jest undefined
to, że wykonujesz operację asynchroniczną. Oznacza to, że ukończenie getEventList
metody zajmie trochę czasu (w zależności głównie od szybkości sieci).
Spójrzmy więc na wywołanie http.
this.es.getEventList()
Po wykonaniu („odpaleniu”) żądania http subscribe
będziesz czekać na odpowiedź. Podczas oczekiwania javascript wykona wiersze poniżej tego kodu i jeśli napotka synchroniczne przypisania / operacje, wykona je natychmiast.
Więc po zasubskrybowaniu getEventList()
i oczekiwaniu na odpowiedź,
console.log(this.myEvents);
linia zostanie wykonana natychmiast. A wartość tego jest undefined
zanim odpowiedź nadejdzie z serwera (lub do czegokolwiek, co zainicjowałeś w pierwszej kolejności).
Jest to podobne do zrobienia:
ngOnInit(){
setTimeout(()=>{
this.myEvents = response;
}, 5000);
console.log(this.myEvents); //This prints undefined!
}
Rozwiązanie:
Jak więc rozwiązać ten problem? Użyjemy funkcji callback, która jest subscribe
metodą. Ponieważ kiedy dane dotrą z serwera, znajdą się w środku subscribe
z odpowiedzią.
Więc zmieniając kod na:
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
console.log(this.myEvents); //<-- not undefined anymore
});
wypisze odpowiedź ... po pewnym czasie.
Co powinieneś zrobić:
Z odpowiedzią może być wiele innych rzeczy niż tylko jej rejestrowanie; powinieneś wykonać wszystkie te operacje wewnątrz wywołania zwrotnego (wewnątrz subscribe
funkcji), kiedy nadejdą dane.
Inną rzeczą, o której warto wspomnieć, jest to, że jeśli pochodzisz z Promise
tła, then
wywołanie zwrotne odpowiada subscribe
obserwabli.
Czego nie powinieneś robić:
Nie należy próbować zmieniać operacji asynchronicznej na operację synchronizacji (nie jest to możliwe). Jednym z powodów, dla których mamy operacje asynchroniczne, jest to, że nie zmuszamy użytkownika do czekania na zakończenie operacji, podczas gdy mogą wykonywać inne czynności w tym okresie. Załóżmy, że ukończenie jednej z operacji asynchronicznych zajmuje 3 minuty, a gdybyśmy nie mieli operacji asynchronicznych, interfejs zawiesiłby się na 3 minuty.
Sugerowane czytanie:
Pierwotny zasługa tej odpowiedzi to: Jak zwrócić odpowiedź z wywołania asynchronicznego?
Ale w wydaniu angular2 zostaliśmy wprowadzeni do maszynopisu i obserwabli, więc mam nadzieję, że ta odpowiedź obejmuje podstawy obsługi żądania asynchronicznego z obserwablami.