Callback Hell: Asenkron Kodun Kabusu
Başlangıçta, callback kullanarak asenkron kod yazabilirsiniz. Fakat, daha karmaşık uygulamalarda bu kodlar hızla birbirine girmeye başlar. Callback Hell, bu sorunun adıdır. Aslında, iki ya da üç seviyede iç içe geçmiş callback fonksiyonlarıyla başa çıkmak zor olabilir. Fakat daha büyük projelerde, callback hell gerçekten can sıkıcı olabilir.
Örneğin, bir API'den veri aldıktan sonra başka bir API'ye istek yapmanız gerektiğinde, kodunuz şu şekilde görünebilir:
fetch('url1')
.then(response => response.json())
.then(data1 => {
fetch('url2')
.then(response => response.json())
.then(data2 => {
fetch('url3')
.then(response => response.json())
.then(data3 => {
console.log(data3);
});
});
});
Yukarıdaki kod, callback hell'in basit bir örneğidir. Her yeni asenkron işlem için daha derin iç içe geçmek, kodun okunabilirliğini ve bakımını oldukça zorlaştırır.
Promise'ler: Callback Hell'den Kurtuluş
Örnek olarak, yukarıdaki callback hell kodunu Promise ile şu şekilde düzeltebiliriz:
fetch('url1')
.then(response => response.json())
.then(data1 => {
return fetch('url2');
})
.then(response => response.json())
.then(data2 => {
return fetch('url3');
})
.then(response => response.json())
.then(data3 => {
console.log(data3);
})
.catch(error => console.log('Bir hata oluştu: ', error));
Burada, her bir API çağrısı bir Promise döndürüyor ve .then() metoduyla sırayla işleniyor. Ayrıca, .catch() bloğu ile hataları daha düzgün bir şekilde yakalayabiliyoruz. Ancak, işler daha karmaşık hale geldiğinde, Promise zincirleri de okunabilirliği zorlaştırabilir.
Async/Await: Modern JavaScript’in Yıldızı
Async/Await yapısı ile aynı örneği şöyle yazabiliriz:
async function getData() {
try {
const response1 = await fetch('url1');
const data1 = await response1.json();
const response2 = await fetch('url2');
const data2 = await response2.json();
const response3 = await fetch('url3');
const data3 = await response3.json();
console.log(data3);
} catch (error) {
console.log('Bir hata oluştu: ', error);
}
}
getData();
Burada, await anahtar kelimesi asenkron işlemi "bekler" ve async fonksiyonları içerir. Kod akışı daha doğrusal ve senkron hale gelir. Bu da kodun bakımını çok daha kolaylaştırır.
Performans Karşılaştırması
Sonuç: JavaScript'in Evrimi
Bir zamanlar callback hell içinde sıkışıp kalanlar, bugün Async/Await ile rahatça nefes alabiliyorlar. Şimdi, sıra sizde! Hadi, yeni projelerinizde bu yapıları deneyin ve asenkron programlamayı gerçek anlamda ustaca kullanmaya başlayın.