Sebep:
Bunun nedeni, undefined
eşzamansız bir işlem yapıyor olmanızdır. Bu, getEventList
yö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? subscribe
Yöntem olan geri arama işlevini kullanacağız . Çünkü veriler sunucudan geldiğinde subscribe
yanı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; subscribe
veri 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 Promise
arka plandan geliyorsanız , then
geri subscribe
aramanı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.