Motivo:
Il motivo undefined
è che stai effettuando un'operazione asincrona. Significa che ci vorrà del tempo per completare il getEventList
metodo (dipende principalmente dalla velocità della tua rete).
Quindi diamo un'occhiata alla chiamata http.
this.es.getEventList()
Dopo aver effettivamente fatto ("fuoco") la tua richiesta http con subscribe
te, sarai in attesa della risposta. Durante l'attesa, javascript eseguirà le righe sotto questo codice e se incontra assegnazioni / operazioni sincrone le eseguirà immediatamente.
Quindi, dopo esserti iscritto a getEventList()
e in attesa della risposta,
console.log(this.myEvents);
la linea verrà eseguita immediatamente. E il valore è undefined
prima che la risposta arrivi dal server (o da qualsiasi cosa tu abbia inizializzato in primo luogo).
È simile a fare:
ngOnInit(){
setTimeout(()=>{
this.myEvents = response;
}, 5000);
console.log(this.myEvents); //This prints undefined!
}
Soluzione:
Allora come si supera questo problema? Useremo la funzione di callback che è il subscribe
metodo. Perché quando i dati arrivano dal server saranno all'interno del subscribe
con la risposta.
Quindi, cambiando il codice in:
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
console.log(this.myEvents); //<-- not undefined anymore
});
stamperà la risposta .. dopo un po 'di tempo.
Cosa dovresti fare:
Potrebbero esserci molte cose da fare con la tua risposta oltre alla semplice registrazione; dovreste fare tutte queste operazioni all'interno del callback (all'interno della subscribe
funzione), quando arrivano i dati.
Un'altra cosa da menzionare è che se vieni da uno Promise
sfondo, la then
richiamata corrisponde a subscribe
osservabili.
Cosa non dovresti fare:
Non dovresti provare a cambiare un'operazione asincrona in un'operazione di sincronizzazione (non che tu possa farlo). Uno dei motivi per cui abbiamo operazioni asincrone è di non far attendere il completamento di un'operazione mentre può fare altre cose in quel periodo di tempo. Supponiamo che una delle tue operazioni asincrone richieda 3 minuti per essere completata, se non avessimo le operazioni asincrone l'interfaccia si sarebbe bloccata per 3 minuti.
Lettura suggerita:
Il merito originale di questa risposta va a: come restituisco la risposta da una chiamata asincrona?
Ma con la versione angular2 siamo stati introdotti al dattiloscritto e agli osservabili, quindi si spera che questa risposta copra le basi della gestione di una richiesta asincrona con osservabili.