Grund:
Der Grund dafür undefined
ist, dass Sie eine asynchrone Operation ausführen. Das bedeutet, dass es einige Zeit dauern wird, bis die getEventList
Methode abgeschlossen ist (hauptsächlich abhängig von Ihrer Netzwerkgeschwindigkeit).
Schauen wir uns also den http-Aufruf an.
this.es.getEventList()
Nachdem Sie Ihre http-Anfrage mit Ihnen tatsächlich gestellt ("ausgelöst") subscribe
haben, warten Sie auf die Antwort. Während des Wartens führt Javascript die Zeilen unter diesem Code aus und führt sie sofort aus, wenn es auf synchrone Zuweisungen / Operationen stößt.
Nachdem Sie die abonniert getEventList()
und auf die Antwort gewartet haben,
console.log(this.myEvents);
Zeile wird sofort ausgeführt. Und der Wert davon ist, undefined
bevor die Antwort vom Server eintrifft (oder zu dem, was Sie zuerst initialisiert haben).
Es ist ähnlich wie:
ngOnInit(){
setTimeout(()=>{
this.myEvents = response;
}, 5000);
console.log(this.myEvents); //This prints undefined!
}
Lösung:
Wie überwinden wir dieses Problem? Wir werden die Rückruffunktion verwenden, die die subscribe
Methode ist. Denn wenn die Daten vom Server ankommen, befinden sie sich innerhalb der subscribe
mit der Antwort.
Ändern Sie den Code also in:
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
console.log(this.myEvents); //<-- not undefined anymore
});
druckt die Antwort .. nach einiger Zeit.
Was du machen solltest:
Es kann viele andere Dinge mit Ihrer Antwort zu tun haben, als sie nur zu protokollieren. Sie sollten alle diese Vorgänge innerhalb des Rückrufs (innerhalb der subscribe
Funktion) ausführen , wenn die Daten eintreffen.
Eine andere Sache zu erwähnen ist, dass, wenn Sie aus einem Promise
Hintergrund kommen, der then
Rückruf subscribe
mit Observablen entspricht.
Was Sie nicht tun sollten:
Sie sollten nicht versuchen, einen asynchronen Vorgang in einen Synchronisierungsvorgang umzuwandeln (nicht, dass Sie dies können). Einer der Gründe für asynchrone Vorgänge besteht darin, dass der Benutzer nicht auf den Abschluss eines Vorgangs warten muss, während er in diesem Zeitraum andere Aufgaben ausführen kann. Angenommen, einer Ihrer asynchronen Vorgänge dauert 3 Minuten. Wenn wir die asynchronen Vorgänge nicht hätten, würde die Schnittstelle 3 Minuten lang einfrieren.
Vorgeschlagene Literatur:
Die ursprüngliche Gutschrift für diese Antwort lautet: Wie kann ich die Antwort von einem asynchronen Anruf zurückgeben?
Mit der Version angle2 wurden wir jedoch mit Typoskript und Observablen vertraut gemacht, sodass diese Antwort hoffentlich die Grundlagen der Behandlung einer asynchronen Anforderung mit Observablen abdeckt.