Callback: Eski Zamanlardan Bir Kahraman
Bir callback fonksiyonu şöyle çalışır:
function fetchData(callback) {
setTimeout(() => {
console.log("Veri alındı!");
callback();
}, 2000);
}
fetchData(function() {
console.log("Callback fonksiyonu çalıştı.");
});
Bu örnekte, `fetchData` fonksiyonu bir API çağrısını taklit eder. 2 saniye sonra veriyi alır ve verilen callback fonksiyonunu çalıştırır. Ancak, callback fonksiyonlarının en büyük zorluklarından biri "callback hell" veya "callback çukuru" olarak adlandırılan karmaşık yapılar oluşturmasıdır. Eğer birbirine bağlı birçok işlem varsa, kodun okunabilirliği ve bakımı zorlaşır.
Promise: Gelecek İçin Bir Söz
Promise kullanarak yukarıdaki örneği şu şekilde yazabiliriz:
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("Veri alındı!");
resolve(); // Veri başarıyla alındı
}, 2000);
});
}
fetchData().then(() => {
console.log("Promise işlemi tamamlandı.");
});
Bu örnekte, `fetchData` fonksiyonu bir promise döndürüyor. Promise başarılı olduğunda `.then()` metodu çalışıyor ve işlem tamamlandığını belirtiyor. Promises'lar, işlem sırasını daha açık hale getirir, ancak daha karmaşık işlemler için iç içe `.then()` kullanmak yine bazı karmaşıklıklar yaratabilir.
Async/Await: Asenkron Programlamada Yeni Bir Dönem
Async/await ile yukarıdaki örneği şu şekilde yazabiliriz:
async function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("Veri alındı!");
resolve();
}, 2000);
});
}
async function main() {
await fetchData();
console.log("Async/Await işlemi tamamlandı.");
}
main();
Burada, `main` fonksiyonu asenkron hale geldi ve `await` anahtar kelimesiyle `fetchData` fonksiyonunun tamamlanmasını bekledi. Async/await, kodun okunabilirliğini ve bakımını büyük ölçüde kolaylaştırır, çünkü asenkron işlemler blok şeklinde yazılabilir.
Hangisini Ne Zaman Kullanmalı?
- Promises ise daha esnek ve okunabilir bir yapıya sahip olduğu için callback'lerin yerine kullanılabilir. Ancak çok fazla iç içe promise kullanımı yine kodun karmaşıklığını artırabilir.
- Async/Await, en modern ve temiz çözümdür. Özellikle büyük ve karmaşık projelerde, asenkron işlemleri senkron gibi yazmak istiyorsanız async/await kullanmalısınız. Kodun okunabilirliğini artırır ve hata yönetimini kolaylaştırır.