Alasan:
Alasannya undefined
adalah karena Anda membuat operasi asinkron. Artinya akan membutuhkan waktu untuk menyelesaikan getEventList
metode ini (sebagian besar bergantung pada kecepatan jaringan Anda).
Jadi mari kita lihat panggilan http.
this.es.getEventList()
Setelah Anda benar-benar membuat ("api") permintaan http subscribe
Anda dengan Anda akan menunggu respon. Sambil menunggu, javascript akan mengeksekusi baris di bawah kode ini dan jika bertemu dengan tugas / operasi sinkron itu akan segera mengeksekusinya.
Jadi setelah berlangganan getEventList()
dan menunggu tanggapannya,
console.log(this.myEvents);
baris akan segera dieksekusi. Dan nilainya adalah undefined
sebelum respons datang dari server (atau ke apa pun yang telah Anda inisialisasi sebelumnya).
Ini mirip dengan melakukan:
ngOnInit(){
setTimeout(()=>{
this.myEvents = response;
}, 5000);
console.log(this.myEvents); //This prints undefined!
}
Larutan:
Jadi bagaimana kita mengatasi masalah ini? Kami akan menggunakan fungsi panggilan balik yang merupakan subscribe
metode. Karena ketika data datang dari server itu akan berada di dalam subscribe
dengan respon.
Jadi mengubah kodenya menjadi:
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
console.log(this.myEvents); //<-- not undefined anymore
});
akan mencetak tanggapan .. setelah beberapa waktu.
Apa yang harus Anda lakukan:
Mungkin ada banyak hal yang harus dilakukan dengan tanggapan Anda selain hanya mencatatnya; Anda harus melakukan semua operasi ini di dalam callback (di dalam subscribe
fungsi), saat data tiba.
Hal lain yang perlu disebutkan adalah jika Anda berasal dari Promise
latar belakang, then
callback sesuai subscribe
dengan observable.
Apa yang tidak boleh Anda lakukan:
Anda tidak boleh mencoba mengubah operasi asinkron menjadi operasi sinkronisasi (Anda tidak bisa). Salah satu alasan kami memiliki operasi asinkron adalah untuk tidak membuat pengguna menunggu operasi selesai sementara mereka dapat melakukan hal lain dalam jangka waktu tersebut. Misalkan salah satu operasi asinkron Anda membutuhkan waktu 3 menit untuk menyelesaikan, jika kami tidak memiliki operasi asinkron, antarmuka akan berhenti selama 3 menit.
Bacaan yang Disarankan:
Kredit asli untuk jawaban ini adalah: Bagaimana cara mengembalikan tanggapan dari panggilan asinkron?
Namun dengan rilis angular2, kami diperkenalkan dengan skrip ketikan dan observable sehingga jawaban ini diharapkan mencakup dasar-dasar penanganan permintaan asinkron dengan observable.