เหตุผล:
เหตุผลก็undefined
คือคุณกำลังทำการดำเนินการแบบอะซิงโครนัส หมายความว่าจะใช้เวลาสักครู่ในการดำเนินการตามgetEventList
วิธีนี้ (ส่วนใหญ่ขึ้นอยู่กับความเร็วเครือข่ายของคุณ)
ลองดูที่การโทร http
this.es.getEventList()
หลังจากที่คุณสร้าง ("ไฟ") คำขอ http กับsubscribe
คุณแล้วคุณจะต้องรอการตอบกลับ ในขณะที่รอจาวาสคริปต์จะดำเนินการบรรทัดด้านล่างโค้ดนี้และหากพบการกำหนด / การดำเนินการแบบซิงโครนัสมันจะดำเนินการทันที
ดังนั้นหลังจากสมัครรับข้อมูลgetEventList()
และรอการตอบกลับ
console.log(this.myEvents);
บรรทัดจะถูกดำเนินการทันที และมูลค่าของมันคือundefined
ก่อนที่การตอบสนองจะมาถึงจากเซิร์ฟเวอร์ (หรืออะไรก็ตามที่คุณได้กำหนดค่าเริ่มต้นตั้งแต่แรก)
คล้ายกับการทำ:
ngOnInit(){
setTimeout(()=>{
this.myEvents = response;
}, 5000);
console.log(this.myEvents); //This prints undefined!
}
สารละลาย:
แล้วเราจะเอาชนะปัญหานี้ได้อย่างไร? เราจะใช้ฟังก์ชันเรียกกลับซึ่งเป็นsubscribe
วิธีการ เนื่องจากเมื่อข้อมูลมาถึงจากเซิร์ฟเวอร์ข้อมูลจะอยู่ภายในsubscribe
พร้อมกับการตอบสนอง
ดังนั้นการเปลี่ยนรหัสเป็น:
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
console.log(this.myEvents); //<-- not undefined anymore
});
จะพิมพ์ตอบกลับ .. หลังจากนั้นสักครู่
สิ่งที่คุณควรทำ:
อาจมีหลายสิ่งที่ต้องทำกับคำตอบของคุณนอกเหนือจากการบันทึก คุณควรดำเนินการทั้งหมดเหล่านี้ภายในการเรียกกลับ (ภายในsubscribe
ฟังก์ชัน) เมื่อข้อมูลมาถึง
สิ่งที่ต้องพูดถึงก็คือถ้าคุณมาจากPromise
พื้นหลังการthen
เรียกกลับจะสอดคล้องsubscribe
กับสิ่งที่สังเกตได้
สิ่งที่คุณไม่ควรทำ:
คุณไม่ควรพยายามเปลี่ยนการดำเนินการ async เป็นการดำเนินการซิงค์ (ไม่ใช่ว่าทำได้) เหตุผลประการหนึ่งที่เรามีการดำเนินการ async คือการไม่ทำให้ผู้ใช้รอให้การดำเนินการเสร็จสิ้นในขณะที่พวกเขาสามารถทำสิ่งอื่น ๆ ได้ในช่วงเวลานั้น สมมติว่าหนึ่งในการดำเนินการ async ของคุณใช้เวลา 3 นาทีในการดำเนินการให้เสร็จสมบูรณ์หากเราไม่มีการดำเนินการ async อินเทอร์เฟซจะค้างเป็นเวลา 3 นาที
การอ่านที่แนะนำ:
เครดิตเดิมสำหรับคำตอบนี้ไปที่: ฉันจะส่งคืนการตอบกลับจากการโทรแบบอะซิงโครนัสได้อย่างไร
แต่ด้วยรุ่น angular2 เราได้รับการแนะนำให้รู้จักกับ typescript และ observables ดังนั้นคำตอบนี้หวังว่าจะครอบคลุมพื้นฐานของการจัดการคำขอแบบอะซิงโครนัสกับสิ่งที่สังเกตได้