v2.5.2
Giriş yap

JavaScript Arrow Function'dan Veri Alma Ve GET Request

semih
479 defa görüntülendi ve 2 kişi tarafından değerlendirildi

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.

canpacis
855 gün önce

Ş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 fonksiyon Promise 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();