Asenkron Programlamaya Giriş
Callback: Asenkronluğun İlk Adımı
Örnek bir callback kullanımı şu şekilde olabilir:
function fetchData(callback) {
setTimeout(() => {
console.log("Veri alındı");
callback();
}, 2000);
}
fetchData(() => {
console.log("Callback çağrıldı!");
});
Bu kodda, `fetchData` fonksiyonu bir süre sonra `callback` fonksiyonunu çağırıyor. Ancak, callback kullanırken dikkat etmeniz gereken bazı noktalar vardır. Özellikle, callback hell diye bilinen karmaşık yapılar, birden fazla callback fonksiyonunun iç içe geçmesiyle oluşur ve bu durum kodun okunabilirliğini oldukça zorlaştırır.
Promise: Callback'ten Bir Adım Öteye
Promise yapısının temel kullanımını şöyle örneklendirebiliriz:
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("Veri alındı");
resolve("Başarıyla tamamlandı");
}, 2000);
});
}
fetchData()
.then(result => {
console.log(result);
})
.catch(error => {
console.log(error);
});
Burada, `fetchData` fonksiyonu bir `Promise` döner. Eğer işlem başarılıysa `resolve` fonksiyonu çağrılır, aksi takdirde `reject` fonksiyonu devreye girer. .then() ve .catch() yöntemleri sayesinde sonuçları daha temiz bir şekilde yakalayabiliriz. Bu yapı, callback fonksiyonlarına göre daha düzenli bir yapıya sahip olsa da, yine de karmaşık işlemler sonucu büyük projelerde Promise chaining (zincirleme) ile daha anlaşılabilir hale gelir.
Async/Await: Modern JavaScript’in Yıldızları
Async/await yapısını şöyle bir örnekle inceleyelim:
async function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("Veri alındı");
resolve("Başarıyla tamamlandı");
}, 2000);
});
}
async function fetchDataAndProcess() {
const result = await fetchData();
console.log(result);
}
fetchDataAndProcess();
Bu örnekte, `fetchDataAndProcess` fonksiyonu asenkron olarak çalışıyor ve `await` anahtar kelimesiyle `fetchData()` fonksiyonunun tamamlanmasını bekliyor. Buradaki en büyük avantaj, asenkron işlemlerle yazılmış kodun senkron bir yapıya bürünmesidir. Bu da kodun okunabilirliğini artırır ve karmaşıklığı azaltır.
Peki, Hangisini Ne Zaman Kullanmalısınız?
Ancak, JavaScript’in modern sürümlerinde async/await yapıları en temiz çözümü sunar. Eğer projede karmaşık işlemler yoksa, async/await ile yazılan kodlar genellikle daha kısa ve anlaşılırdır. Ayrıca, asenkron işlemleri beklemek için bekleme süresi üzerinde daha fazla kontrol sağlamak için bu yapıyı tercih etmeniz oldukça faydalıdır.
Sonuç Olarak
---