JavaScript'te Asenkron Programlamanın Bilinmeyen Yönleri: Callback'lerden Promiselere ve Async/Await'e Geçiş Süreci

 JavaScript'te Asenkron Programlamanın Bilinmeyen Yönleri: Callback'lerden Promiselere ve Async/Await'e Geçiş Süreci

**

BFS



Asenkron programlama, JavaScript dünyasında pek çok geliştirici için bir dönüm noktasıdır. Bu terim, JavaScript'in sunucuya yapılan istekler gibi işlemleri beklemeden devam etmesini sağlayan özelliği ifade eder. Ancak asenkron programlamanın evrimi, temeldeki yapıların nasıl geliştiğini görmek için ilginç bir yolculuğa çıkar. Bu yazıda, asenkron programlamanın nasıl değiştiğini, callback fonksiyonlarından Promiselere ve son olarak async/await yapısına nasıl geçildiğini detaylı bir şekilde inceleyeceğiz. Her adımda, yazılım geliştirme sürecinizi nasıl daha verimli hale getirebileceğinizi de keşfedeceksiniz.

Callback Fonksiyonlarının Avantajları ve Dezavantajları

JavaScript'te asenkron kod yazmanın ilk yolu
callback fonksiyonları ile başlar. Callback, bir işlemi tamamladıktan sonra çağrılan fonksiyonlardır. Yani, bir işlemin bitmesini beklemeden diğer işlemler devam eder ve iş bittikçe belirli fonksiyonlar çalıştırılır. Peki, callback kullanmanın avantajları nelerdir?

-
Kolaylık: Asenkron işlemleri yönetmenin en basit yoludur. Bir işlem bittiğinde, onu başka bir işten önce çalıştırabilirsiniz.
-
Esneklik: Birden fazla işlemi ardışık şekilde işletebilir ve birbirinden bağımsız olarak yönetebilirsiniz.

Ancak callback fonksiyonlarının da bazı ciddi dezavantajları vardır. En büyük sorunlardan biri
callback hell (callback cehennemi) olarak bilinen durumu yaratmasıdır. Bu, iç içe geçmiş callback'lerin karmaşık bir hale gelmesine yol açar ve kodun okunabilirliğini düşürür.


function fetchData(callback) {
  setTimeout(() => {
    const data = "Data fetched!";
    callback(data);
  }, 1000);
}

fetchData(function(result) {
  console.log(result); // Data fetched!
});


Kodun basit olması güzel, ancak daha karmaşık projelerde bu tür yapılar iç içe geçmeye başladığında kodun bakımını yapmak çok zorlaşır.

Promise Kullanımı ve Hata Yönetimi

Neyse ki, JavaScript bu sorunu çözmek için
Promise yapısını geliştirdi. Promise, gelecekte bir değerin sağlanacağına dair garanti verir. Bir işlem başladığında, bir Promise oluşturulur ve bu işlem başarıyla tamamlandığında `.then()` metodu ile işlem sonucu alınır. Eğer bir hata olursa, `.catch()` metodu ile bu hatayı yakalayabilirsiniz.

Promise, callback hell sorununu ortadan kaldırarak daha temiz ve daha yönetilebilir bir yapı sunar.


function fetchDataWithPromise() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const data = "Data fetched successfully!";
      resolve(data);
    }, 1000);
  });
}

fetchDataWithPromise()
  .then(result => console.log(result)) // Data fetched successfully!
  .catch(error => console.log("Error: ", error));


Promise, kodunuzu daha okunabilir ve bakımı kolay hale getirir, ancak karmaşık işlemler için bazen oldukça fazla satır yazılmasına neden olabilir. Burada, "daha fazlası" dedirten bir adım daha var:
Async/Await.

Async/Await Yapısı ile Daha Temiz ve Okunabilir Kod

JavaScript'teki en büyük devrimlerden biri,
async/await yapısının gelmesidir. Bu yapılar, asenkron kodu senkron koda çok daha yakın hale getirir. Artık `.then()` ve `.catch()` gibi zincirlemelerle uğraşmanıza gerek yoktur. `async` anahtar kelimesi bir fonksiyonun asenkron olduğunu belirtirken, `await` ile de promise'in sonucunu bekleyebilirsiniz.

Async/await, daha kısa ve daha temiz kod yazmanıza olanak tanır. Ayrıca hata yönetimini de oldukça basitleştirir.


async function fetchDataAsync() {
  try {
    const result = await fetchDataWithPromise();
    console.log(result); // Data fetched successfully!
  } catch (error) {
    console.log("Error: ", error);
  }
}

fetchDataAsync();


Burada gördüğünüz gibi, asenkron işlemler tamamen senkronmuş gibi yazılabilir. Kodun okunabilirliği büyük ölçüde artar ve hatalarla başa çıkmak daha basit hale gelir.

Asenkron Kod Yazarken Performans Optimizasyonu

Her ne kadar async/await, Promise ve callback yapıları işlerken oldukça kullanışlı olsa da, performansı göz ardı etmek büyük bir hata olur. Asenkron kod yazarken, birçok farklı işlem paralel bir şekilde yürütülüyorsa, bunun yönetilmesi önemlidir. İşlem sırasını ve zamanlamayı iyi yönetmek, uygulamanızın hızını doğrudan etkiler.

Örneğin, birden fazla API isteğini aynı anda yapmak yerine her birini sırayla yapmak, gereksiz beklemelere yol açabilir. Bunun yerine,
Promise.all() kullanarak birden fazla asenkron işlemi aynı anda başlatabilir ve bunların hepsinin tamamlanmasını bekleyebilirsiniz.


async function fetchMultipleData() {
  const [result1, result2] = await Promise.all([fetchDataWithPromise(), fetchDataWithPromise()]);
  console.log(result1, result2);
}

fetchMultipleData();


Hatalarla Başa Çıkma Teknikleri

Son olarak, asenkron programlamada hata yönetimi büyük önem taşır.
try-catch blokları, asenkron işlemlerle birlikte kullanıldığında hataların yakalanmasını kolaylaştırır. Ayrıca, finally bloğu ile her durumda yapılması gereken işlemler yazılabilir. Bu yapılar sayesinde, uygulamanızda hataların önüne geçebilir ve hatalarla etkili bir şekilde başa çıkabilirsiniz.

---

İlgili Yazılar

Benzer konularda diğer yazılarımız

ASP.NET Core ile Mobil Uygulama Geliştirme: Cross-Platform Web ve Mobil Uygulama Birleştirme

Günümüzde mobil uygulamalar hayatımızın ayrılmaz bir parçası haline geldi. Akıllı telefonlarımızda geçirdiğimiz zamanın büyük bir kısmını mobil uygulamalar sayesinde geçiriyoruz. Peki, bir mobil uygulama geliştirirken karşılaştığımız zorlukları nasıl...

Modern Yazılım Geliştirme Süreçlerinde Yapay Zeka ve Otomasyonun Rolü: 2025’te Yeni Başlangıçlar

Yazılım geliştirme dünyası hızla evriliyor. 2025 yılına adım attığımızda, bu süreçte yapay zeka ve otomasyonun rolü hiç olmadığı kadar önemli hale geldi. Geçmişte yazılım geliştirme yalnızca kod yazmak ve sistemleri test etmekle sınırlıydı. Ancak bugünün...

Yazılım Geliştiriciler İçin Verimli Çalışma Alanı Oluşturmanın İpuçları: En İyi Araçlar ve Yöntemler

Verimli Bir Çalışma Alanı Neden Önemlidir?Yazılım geliştirici olmanın zorluklarından biri de sürekli odaklanmış ve üretken olabilmektir. Bir geliştirici olarak, işlerinizin çoğunu bilgisayar başında geçirirsiniz ve bu süre zarfında verimli bir çalışma...