Sebep:
Bunun nedeni, undefinedeşzamansız bir işlem yapıyor olmanızdır. Bu, getEventListyöntemi tamamlamanın biraz zaman alacağı anlamına gelir (çoğunlukla ağ hızınıza bağlı olarak).
Öyleyse http çağrısına bakalım.
this.es.getEventList()
Siz gerçekten ("ateş") yaptıktan sonra http talebiniz yanıt bekliyorsubscribe olacak . Javascript beklerken bu kodun altındaki satırları çalıştıracak ve eşzamanlı atamalarla / işlemlerle karşılaşırsa hemen çalıştıracaktır.
Yani, abone olduktan getEventList()ve yanıtı bekledikten sonra ,
console.log(this.myEvents);
satır hemen çalıştırılacaktır. Ve değeri undefined, sunucudan yanıt gelmeden öncedir (ya da ilk başta onu başlattığınız her şeye).
Yapmaya benzer:
ngOnInit(){
setTimeout(()=>{
this.myEvents = response;
}, 5000);
console.log(this.myEvents); //This prints undefined!
}
Çözüm:
Peki bu sorunu nasıl aşarız? subscribeYöntem olan geri arama işlevini kullanacağız . Çünkü veriler sunucudan geldiğinde subscribeyanıtı ile birlikte olacaktır .
Yani kodu şu şekilde değiştirmek:
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
console.log(this.myEvents); //<-- not undefined anymore
});
yanıtı yazdıracak .. bir süre sonra.
Ne yapmalısın:
Yanıtınız ile günlük tutmak dışında yapılacak birçok şey olabilir; subscribeveri geldiğinde tüm bu işlemleri geri arama içinde ( işlevin içinde ) yapmanız gerekir .
Söylenecek başka bir şey de, bir Promisearka plandan geliyorsanız , thengeri subscribearamanın gözlemlenebilirlere karşılık gelmesidir.
Yapmamanız gerekenler:
Eşzamanlı olmayan bir işlemi eşitleme işlemine değiştirmeye çalışmamalısınız (yapabileceğinizden değil). Eşzamansız işlemlere sahip olmamızın nedenlerinden biri, kullanıcıyı o zaman diliminde başka şeyler yapabilirken, bir işlemin tamamlanmasını bekletmemektir. Eşzamansız işlemlerinizden birinin tamamlanmasının 3 dakika sürdüğünü varsayalım, eşzamansız işlemler olmasaydı arayüz 3 dakika donacaktı.
Önerilen Okuma:
Bu cevabın asıl değeri şu şekildedir: Eşzamansız bir aramadan gelen yanıtı nasıl geri getirebilirim?
Ancak, angular2 sürümüyle birlikte daktilo ve gözlemlenebilirlerle tanıştık, bu nedenle bu yanıtın, gözlemlenebilirlerle eşzamansız bir isteği ele almanın temellerini kapsadığını umuyoruz.