Callback Hell: Başlangıçta Karşımıza Çıkan Fırtına
Düşün ki, JavaScript'te bir veritabanından veri çekmen gerekiyor. Bunun için bir API isteği yapman lazım. Ancak bu işlem asenkron olduğundan, sonucun gelmesini beklerken başka kodlar çalışmaya devam eder. İlk başta bu mantığı anlamak kolay olabilir, ama işler karmaşıklaştığında işler karışabilir.
Örneğin, aşağıdaki gibi bir yapı düşün:
doSomething(function(result1) {
doSomethingElse(result1, function(result2) {
doAnotherThing(result2, function(result3) {
doFinalThing(result3);
});
});
});
Bu kod, yalnızca 3 işlevi birbirine bağlarken bile karmaşıklaşıyor. Bir hata oluştuğunda, hangi callback'in nereye ait olduğunu bulmak neredeyse imkansız hale gelebilir.
Async/Await: Karmaşıklığı Basitliğe Dönüştürmek
Ancak JavaScript dünyasında bir dönüşüm yaşanıyor. Async/await, bu karmaşayı ortadan kaldırmak için geliştirilmiş bir yapı. Aslında, `async` fonksiyonları ve `await` anahtar kelimeleri, asenkron kodu senkron gibi yazmanıza imkan tanır.
Örneğin, callback hell'i async/await ile nasıl çözebileceğimize bakalım:
async function fetchData() {
try {
const result1 = await doSomething();
const result2 = await doSomethingElse(result1);
const result3 = await doAnotherThing(result2);
await doFinalThing(result3);
} catch (error) {
console.error(error);
}
}
Görüldüğü gibi, async/await ile kod çok daha düz ve anlaşılır hale geliyor. Kodun akışını takip etmek artık çok daha kolay ve hataları yakalamak da daha verimli.
Async/Await ile Verimliliği Artırmak
Modern JavaScript geliştiricileri, async/await'i sadece kodun okunabilirliğini artırmak için değil, aynı zamanda daha verimli kod yazmak için de kullanıyor. `Promise.all()` gibi yöntemlerle birden fazla asenkron işlemi paralel olarak çalıştırmak, performansı ciddi anlamda artırabilir.
async function fetchData() {
try {
const [result1, result2] = await Promise.all([doSomething(), doSomethingElse()]);
await doFinalThing(result1, result2);
} catch (error) {
console.error(error);
}
}
Bu kodda, `doSomething` ve `doSomethingElse` işlemleri paralel olarak başlatılıyor. Böylece zaman kaybı olmadan her iki işlem de aynı anda gerçekleşiyor.