JavaScript Arrow Function'dan Veri Alma Ve GET Request
Kod:
Çıktı:
Yukarıda belirttiğim şekilde Request gönderiyorum. Ve sorunsuz şekilde cevabı alıyorum. Lakin aldığım cevabı fonksiyonun dışına değişken olarak çıkaramıyorum.
JavaScript'te biraz yeniyim. Yardımcı olursanız sevinirim.
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (4)
Şimdi durum şöyle;
JavaScript'in çalışma biçimi biraz değişik. Kod tek bir thread'de çalıştığı için event-loop denilen bir mekanizmayla çalışıyor her şey.
Bunlar işin kompleks kısmı ama araştırma istersen diye yazayım dedim.
Burada yazdığın kod yukarıdan aşağıya doğru tek tek ve komut komut çalışacak. Öncelikle axios kütüphanesi import edilecek ve axios.get
fonksiyonu çalışacak. Axios'un internet üzerinden gidip herhangi bir kaynağı çekmesi uzun bir olay olabilir, bilgisayar ne
kadar süreceğiniz bilemez (internet hızına göre değişir sonuçta). Bu yüzden programı dondurmamak amacıyla bu işlemi yedeğe alıp diğer
komutlara devam eder.
Bu tarz bir yaklaşım mantıklı gelebilir sana ama sorununu çözmeyecektir. Sırayla komutları inceleyerek bakalım;
- Axios kütüphanesini import ettik
resp
adında bir değişken oluşturup, değerini boş bir nesneye atadık.axios.get()
fonksiyonunu çalıştırdık. Bu fonksiyonPromise
denen bir değer tipi döndürüyor.- Promise tipi süresini bilemeyeceğimiz asenkron işlemler için kullanılıyor.
- Fonksiyon üzerinde
.then()
çalıştırabileceğin yeni bir nesne döndürüyor. - İşlem tamamlandığında da içindeki komutları gerçekleştiriyor. O yüzden
.then()
kısmının içinde yaptığın hiçbir şey henüz gerçekleşmeyecek
resp
nesnesini konsola yazdırıyoruz.- Konsol çıktısı boş bir nesne olacaktır çünkü nesne ile hiçbir şey yapmadık.
axios.get()
fonksiyonu tamamlandı ve gerekli kaynak hazır.resp
değişkenini gelen cevaba atadık.- Ancak bu noktada program çoktan bitti. Elimizde de herhangi bir değer kalmadı.
Event loop ile ilgili ilginç bir durum var. Her bir asenkron işlem bir kuyruğa eklenip uygulanabilecek en erken zamanda işleniyor. Yani
eğer internet üzerinden istediğin kaynağı ışık hızında bile çeksen .then()
içindeki kısım programın bir sonraki tick
'inde çalışacak.
Bu da programın bittiği kısma denk geliyor. Ne yaparsak yapalım, cevabı promise dönen bir fonksiyondan hemen sonra .then()
kısmındaki
veriye ulamayız.
CEVAP ŞÖYLE;
Promise'i beklemen lazım. async/await
anahtar kelimeleri burda işimizi görecek. Öncelikle .then()
çağrısını kaldırıp await
anahtar kelimesi ile değiştireceğiz.
Yapacağımız ikinci bir işlem daha var. await
anahtar kelimesi özel bir sentaks oluşturuyor, bunu sadece async
fonksiyonlarda
kullanabiliriz. async
fonksiyonlar da sadece başında async
anahtar kelimesini içeren fonksiyonlar. Bu yüzden programı bir
fonksiyonla sarmalayacağız.
Kodun son hali böyle olacak;
bu şekilde dene.
let block scpoe olduğu için süslü parantez dışarısına çıkmaz.