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ı
- 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
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
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
Ö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
---