Razón:
El motivo undefined
es que está realizando una operación asincrónica. Lo que significa que tomará algún tiempo completar elgetEventList
método (dependiendo principalmente de la velocidad de su red).
Así que veamos la llamada http.
this.es.getEventList()
Después de hacer ("disparar") su solicitud http subscribe
, estará esperando la respuesta. Mientras espera, javascript ejecutará las líneas debajo de este código y si encuentra asignaciones / operaciones sincrónicas, las ejecutará inmediatamente.
Entonces, después de suscribirse al getEventList()
y esperar la respuesta,
console.log(this.myEvents);
La línea se ejecutará inmediatamente. Y su valor es undefined
antes de que llegue la respuesta del servidor (o lo que sea que lo haya inicializado en primer lugar).
Es similar a hacer:
ngOnInit(){
setTimeout(()=>{
this.myEvents = response;
}, 5000);
console.log(this.myEvents); //This prints undefined!
}
Solución:
Entonces, ¿cómo superamos este problema? Usaremos la función de devolución de llamada que es el subscribe
método. Porque cuando los datos lleguen del servidor estarán dentro del subscribe
con la respuesta.
Entonces cambiando el código a:
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
console.log(this.myEvents); //<-- not undefined anymore
});
imprimirá la respuesta .. después de algún tiempo.
Qué debes hacer:
Puede que haya muchas cosas que hacer con su respuesta además de registrarla; debe hacer todas estas operaciones dentro de la devolución de llamada (dentro de la subscribe
función), cuando llegan los datos.
Otra cosa a mencionar es que si viene de un Promise
fondo, la then
devolución de llamada se corresponde subscribe
con los observables.
Qué no debes hacer:
No debe intentar cambiar una operación asíncrona a una operación de sincronización (no es que pueda). Una de las razones por las que tenemos operaciones asíncronas es para no hacer que el usuario espere a que se complete una operación mientras puede hacer otras cosas en ese período de tiempo. Suponga que una de sus operaciones asíncronas tarda 3 minutos en completarse, si no tuviéramos las operaciones asíncronas, la interfaz se congelaría durante 3 minutos.
Lectura sugerida:
El crédito original de esta respuesta es: ¿Cómo devuelvo la respuesta de una llamada asincrónica?
Pero con la versión angular2 nos presentaron a mecanografiado y observables, por lo que es de esperar que esta respuesta cubra los conceptos básicos del manejo de una solicitud asincrónica con observables.