JavaScript Arrow Function'dan Veri Alma Ve GET Request
Kod:
const axios = require('axios');
axios.get('https://jsonplaceholder.typicode.com/todos/1')
.then(res => {
console.log(res.data);
});
Çıktı:
{ userId: 1, id: 1, title: 'delectus aut autem', completed: false }
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.
const axios = require('axios');
axios.get('https://jsonplaceholder.typicode.com/todos/1')
.then(res => {
console.log(res.data);
});
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.
const axios = require('axios');
let resp = {};
axios.get('https://jsonplaceholder.typicode.com/todos/1')
.then(res => {
resp = res.data;
});
console.log(resp);
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.
const axios = require('axios');
// then kısmındaki `res` değişkenini yukarı taşıyacağız.
const res = await axios.get('https://jsonplaceholder.typicode.com/todos/1')
// ^
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;
const axios = require('axios');
// asıl olayları sarmaladığımız fonksiyon
async function main() {
const res = await axios.get('https://jsonplaceholder.typicode.com/todos/1');
console.log(res.data);
}
// son olarak fonksiyonu çalıştıralım.
main();
bu şekilde dene.
let block scpoe olduğu için süslü parantez dışarısına çıkmaz.
const axios = require('axios');
let resp = {};
axios.get('https://jsonplaceholder.typicode.com/todos/1')
.then(res => {
resp = res.data;
});
console.log(resp);
@selim
Kod:
const axios = require('axios');
let resp = null;
axios.get('https://jsonplaceholder.typicode.com/todos/1')
.then(res => {
resp = res.data;
});
console.log(resp);
Çıktı:
null
Nerde hata yaptım?
Güncelleme!
Hatamı fark ettim ve dediğin gibi yaptım. Bu sefer de let ile oluşturduğum değişken not defined hatası alıyor.
Kod:
const axios = require('axios');
axios.get('https://jsonplaceholder.typicode.com/todos/1')
.then(res => {
let resp = null;
resp = res.data;
});
console.log(resp);
Çıktı:
console.log(resp);
^
ReferenceError: resp is not defined
...