Saya memiliki layanan yang mengembalikan pengamatan yang melakukan permintaan http ke server saya dan mendapatkan datanya. Saya ingin menggunakan data ini tetapi saya selalu mendapatkannya undefined
. Apa masalahnya?
Layanan :
@Injectable()
export class EventService {
constructor(private http: Http) { }
getEventList(): Observable<any>{
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
return this.http.get("http://localhost:9999/events/get", options)
.map((res)=> res.json())
.catch((err)=> err)
}
}
Komponen:
@Component({...})
export class EventComponent {
myEvents: any;
constructor( private es: EventService ) { }
ngOnInit(){
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
});
console.log(this.myEvents); //This prints undefined!
}
}
Saya memeriksa Bagaimana cara mengembalikan respons dari panggilan asinkron? posting tetapi tidak dapat menemukan solusi
Jawaban:
Alasan:
Alasannya
undefined
adalah karena Anda membuat operasi asinkron. Artinya akan membutuhkan waktu untuk menyelesaikangetEventList
metode ini (sebagian besar bergantung pada kecepatan jaringan Anda).Jadi mari kita lihat panggilan http.
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:
Larutan:
Jadi mengubah kodenya menjadi:
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 sesuaisubscribe
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.
sumber
Melakukan panggilan http dalam angular / javascript adalah operasi asinkron. Jadi ketika Anda membuat panggilan http, utas baru akan ditetapkan untuk menyelesaikan panggilan ini dan memulai eksekusi baris berikutnya dengan utas lain. Itulah mengapa Anda mendapatkan nilai yang tidak terdefinisi. jadi buat perubahan di bawah ini untuk mengatasi ini
sumber
Kamu bisa memakai asyncPipe jika Anda menggunakan myEvents hanya di template.
Berikut contoh dengan asyncPipe dan Angular4 HttpClient contoh
sumber
Yang bisa diamati itu malas jadi Anda harus berlangganan untuk mendapatkan nilainya. Anda berlangganan dengan benar dalam kode Anda tetapi secara bersamaan mencatat output di luar blok 'berlangganan'. Itulah mengapa ini 'tidak ditentukan'.
Jadi jika Anda masuk ke dalam blok berlangganan maka itu akan mencatat respons dengan benar.
sumber
Berikut masalah ini, Anda menginisialisasi
this.myEvents
kesubscribe()
yang merupakan blok asynchronous saat Anda melakukanconsole.log()
hanya keluar darisubscribe()
blok. Jadiconsole.log()
dipanggil sebelumthis.myEvents
diinisialisasi.Harap pindahkan kode console.log () Anda juga di dalam subscribe () dan selesai.
sumber
Hasilnya tidak terdefinisi karena proses sudut async. Anda bisa mencoba seperti di bawah ini:
sumber
Pastikan juga Anda memetakan respons Anda ke keluaran json. Jika tidak, itu akan mengembalikan teks biasa. Anda melakukannya seperti ini:
sumber
Tidak ditentukan karena nilai di sini dicatat sebelum data apa pun dari layanan disetel dari panggilan layanan berlangganan di atas. Jadi Anda harus menunggu hingga panggilan ajax selesai dan mengatur data dari data respons.
Di sini membuat log Konsol di dalam metode berlangganan yang akan membuat log ketika data diatur dalam variabel myEvents.
sumber
Anda cukup mencoba metode ini-
sumber