कारण:
इसका कारण यह 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 मिनट के लिए फ्रीज़ हो जाएगा।
सुझाया गया पढ़ना:
इस उत्तर का मूल श्रेय इस बात को जाता है: मैं एसिंक्रोनस कॉल से प्रतिक्रिया कैसे लौटाऊं?
लेकिन कोणीय 2 रिलीज के साथ हमें टाइपस्क्रिप्ट और वेधशालाओं के लिए पेश किया गया था, इसलिए यह जवाब उम्मीद के मुताबिक पर्यवेक्षकों के साथ एक अतुल्यकालिक अनुरोध को संभालने की मूल बातें शामिल करता है।