Softmush.com, teknoloji, yazılım ve dijital dünyaya dair derinlemesine içeriklerle bilgiye ulaşmanın güvenilir adresi. - Softmush.com
“ Söz konusu olan vatansa, gerisi teferruat. ”
Mustafa K. Atatürk
JavaScript Dilinde Asenkron Programlama: Kapsamlı Bir Kılavuz

JavaScript Dilinde Asenkron Programlama: Kapsamlı Bir Kılavuz

JavaScript, doğası gereği tek iş parçacıklı (single-threaded) bir dildir. Bu durum, uzun süren veya dış kaynaklara bağımlı işlemleri (örneğin, ağ istekleri, dosya okuma/yazma) doğrudan ana iş parçacığında yürütmenin kullanıcı arayüzünü kilitlemesine ve uygulamanın donmasına neden olacağı anlamına gelir. Bu tür senaryolarda uygulamanın yanıt verebilirliğini korumak ve verimli çalışmasını sağlamak için asenkron programlama teknikleri kullanılır. Bu kılavuz, JavaScript'te asenkron işlemlerin nasıl yönetildiğini, özellikle modern async/await sözdizimi ve altında yatan Promise mekanizmasını adım adım açıklamaktadır.


Sözdizimi


Modern JavaScript'te asenkron kod yazmanın en yaygın ve okunabilir yolu async ve await anahtar kelimelerini kullanmaktır. Bu sözdizimi, Promise tabanlı asenkron kodun senkron koda benzer bir şekilde yazılmasını sağlar.


async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Veri çekme hatası:', error);
  }
}

fetchData();

Detaylı Açıklama


  • async Anahtar Kelimesi: Bir fonksiyonun önüne async anahtar kelimesini eklemek, o fonksiyonu her zaman bir Promise döndüren asenkron bir fonksiyon yapar. Eğer fonksiyon açıkça bir Promise döndürmüyorsa, JavaScript otomatik olarak döndürülen değeri bir Promise içine sarar. Bu, asenkron fonksiyonların zincirleme (chaining) bir şekilde veya await ile kullanılabilmesini sağlar.

  • await Anahtar Kelimesi: Sadece async olarak işaretlenmiş bir fonksiyonun içinde kullanılabilen await anahtar kelimesi, bir Promise'in çözülmesini (yani başarılı bir şekilde tamamlanmasını veya reddedilmesini) bekler. await kullanılan satırda kodun yürütülmesi duraklatılır ve Promise çözüldüğünde devam eder. Eğer Promise başarılı olursa, await ifadesi Promise'in değerini döndürür. Eğer Promise reddedilirse, await bir hata fırlatır ve bu hata try...catch bloğu ile yakalanabilir.

  • Promise Nesnesi: async/await sözdiziminin temelinde Promise nesnesi yatar. Bir Promise, asenkron bir işlemin nihai sonucunu (başarı değeri veya hata nedeni) temsil eden bir JavaScript nesnesidir. Üç ana durumu vardır:

    • pending (beklemede): Asenkron işlem henüz tamamlanmadı.

    • fulfilled (tamamlandı/çözüldü): Asenkron işlem başarıyla tamamlandı ve bir değer döndürdü.

    • rejected (reddedildi): Asenkron işlem bir hata nedeniyle başarısız oldu.

    Promise'ler, .then() metodu ile başarılı sonuçları, .catch() metodu ile hataları ve .finally() metodu ile her iki durumda da çalışacak kod bloklarını yönetmek için kullanılır.


Pratik Kullanım Örnekleri


Örnek 1: Temel Asenkron İşlem ve Veri Çekme


Bu örnek, bir ağ isteğini simüle eden bir fonksiyonun async/await ile nasıl çağrıldığını ve sonucunun nasıl işlendiğini göstermektedir.


function simulateNetworkRequest(url) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(`Veri ${url} adresinden başarıyla çekildi.`);
      resolve({ id: 1, data: `Veri ${url} için` });
    }, 2000); // 2 saniye gecikme
  });
}

async function getDataFromApi() {
  console.log('API\'den veri çekiliyor...');
  const result = await simulateNetworkRequest('https://api.example.com/users');
  console.log('Çekilen veri:', result);
  console.log('Veri çekme işlemi tamamlandı.');
}

getDataFromApi();
// Beklenen Çıktı:
// API'den veri çekiliyor...
// (2 saniye sonra)
// Veri https://api.example.com/users adresinden başarıyla çekildi.
// Çekilen veri: { id: 1, data: 'Veri https://api.example.com/users için' }
// Veri çekme işlemi tamamlandı.

Örnek 2: Hata Yönetimi


Asenkron işlemlerde hata yönetimi kritik öneme sahiptir. try...catch blokları, await ile tetiklenen Promise reddedilmelerini yakalamak için kullanılır.


function simulateFailedNetworkRequest(url) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (Math.random() > 0.5) { // Rastgele hata simülasyonu
        reject(new Error(`Hata: ${url} adresinden veri çekilemedi.`));
      } else {
        resolve({ id: 2, data: `Başarılı veri ${url} için` });
      }
    }, 1500);
  });
}

async function fetchDataWithErrorHandling() {
  console.log('Hata yönetimi ile veri çekiliyor...');
  try {
    const data = await simulateFailedNetworkRequest('https://api.example.com/products');
    console.log('Çekilen veri:', data);
  } catch (error) {
    console.error('Bir hata oluştu:', error.message);
  } finally {
    console.log('Veri çekme girişimi sonlandı.');
  }
}

fetchDataWithErrorHandling();
// Beklenen Çıktı (başarılı olursa):
// Hata yönetimi ile veri çekiliyor...
// (1.5 saniye sonra)
// Çekilen veri: { id: 2, data: 'Başarılı veri https://api.example.com/products için' }
// Veri çekme girişimi sonlandı.

// Beklenen Çıktı (hata olursa):
// Hata yönetimi ile veri çekiliyor...
// (1.5 saniye sonra)
// Bir hata oluştu: Hata: https://api.example.com/products adresinden veri çekilemedi.
// Veri çekme girişimi sonlandı.

Örnek 3: Paralel Asenkron İşlemler


Birden fazla asenkron işlemi aynı anda başlatmak ve hepsinin tamamlanmasını beklemek için Promise.all() kullanılabilir. Bu, bekleme sürelerini optimize eder.


function fetchResource(resourceName, delay) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(`${resourceName} çekildi.`);
      resolve(`${resourceName} verisi`);
    }, delay);
  });
}

async function fetchMultipleResources() {
  console.log('Kaynaklar paralel olarak çekiliyor...');
  const [users, products, orders] = await Promise.all([
    fetchResource('Kullanıcılar', 3000), // 3 saniye
    fetchResource('Ürünler', 1000),    // 1 saniye
    fetchResource('Siparişler', 2000)   // 2 saniye
  ]);

  console.log('Tüm kaynaklar çekildi.');
  console.log('Kullanıcılar:', users);
  console.log('Ürünler:', products);
  console.log('Siparişler:', orders);
}

fetchMultipleResources();
// Beklenen Çıktı:
// Kaynaklar paralel olarak çekiliyor...
// (1 saniye sonra) Ürünler çekildi.
// (2 saniye sonra) Siparişler çekildi.
// (3 saniye sonra) Kullanıcılar çekildi.
// Tüm kaynaklar çekildi.
// Kullanıcılar: Kullanıcılar verisi
// Ürünler: Ürünler verisi
// Siparişler: Siparişler verisi

Önemli Notlar


  • await Kullanımı: await anahtar kelimesi yalnızca async olarak işaretlenmiş fonksiyonların içinde kullanılabilir. Global kapsamda veya senkron fonksiyonlarda doğrudan await kullanmaya çalışmak sözdizimi hatasına yol açacaktır.

  • async Fonksiyonların Dönüş Değeri: Her async fonksiyon, döndürdüğü değeri otomatik olarak bir Promise içine sarar. Eğer bir değer döndürülmezse, Promise.resolve(undefined) döndürülür.

  • Hata Yönetimi: async/await ile hata yönetimi için try...catch blokları kullanmak, senkron koddaki hata yönetimine benzer bir yapı sunarak kodu daha okunabilir hale getirir. Promise reddedildiğinde, await bir hata fırlatır ve bu catch bloğu tarafından yakalanır.

  • Promise.all() ve Paralellik: Birden fazla bağımsız asenkron işlemi paralel olarak yürütmek ve hepsinin sonucunu beklemek için Promise.all() kullanın. Bu, toplam yürütme süresini önemli ölçüde azaltabilir. Eğer işlemlerden herhangi biri reddedilirse, Promise.all() hemen reddedilerek hatayı döndürür.

  • Bloke Edici Olmayan (Non-blocking) Yapı: Asenkron işlemler, uzun süren görevlerin ana iş parçacığını bloke etmesini engeller. Bu sayede uygulamanız kullanıcı etkileşimlerine yanıt vermeye devam eder ve daha akıcı bir kullanıcı deneyimi sunar.

  • Callback Hell'den Kaçınma: async/await, iç içe geçmiş yoğun geri çağırma (callback) fonksiyonlarından kaynaklanan "callback hell" sorununu çözmek için modern ve daha temiz bir alternatif sunar. Bu, kodun okunabilirliğini ve bakımını büyük ölçüde iyileştirir.

Yayınlanma Tarihi: 2025-10-28 00:00:43
HTML Dilinde HTML Dosya Yollarının Kullanımı
Önceki Haber

HTML Dilinde HTML Dosya Yollarının Kullanımı

HTML Makaleleri
Sonraki Haber

SQL Joins: İlişkisel Veritabanlarında Birleştirme İşlemleri

SQL Makaleleri
SQL Joins: İlişkisel Veritabanlarında Birleştirme İşlemleri

Yorum yap

Yorum yapabilmek için  giriş  yapmalısınız.

Yorumlar

Bu yazı hakkında henüz yorum yapılmamıştır.
× JavaScript Dilinde RegExp (Düzenli İfadeler) Kullanımı
Bu ilginizi çekebilir

JavaScript Dilinde RegExp (Düzenli İfadeler) Kullanımı

JavaScript'te düzenli ifadeler (Regular Expressions veya kısaca RegExp), metin içindeki...