Asenkron Programlamaya Giriş
Asenkron programlama, uygulamanızın bir işlem tamamlanmadan diğerine geçmesini sağlayarak daha verimli çalışmasını sağlar. JavaScript’te, özellikle kullanıcı etkileşimi gerektiren uygulamalarda, zaman alıcı işlemler (örneğin, API çağrıları, veritabanı sorguları) sırasında ana iş parçacığının takılmaması önemlidir. İşte burada callback, promise ve async/await gibi kavramlar devreye girer.
Callback, JavaScript’te en eski ve en temel asenkron yapıdır. Callback kullanarak, bir fonksiyonun bitmesini beklemeden başka işlemler yapabilirsiniz. Ancak callback’ler bazen karışıklığa neden olabilir, çünkü callback hell (callback cehennemi) denen karmaşık, iç içe geçmiş fonksiyonlar oluşabilir.
Örnek Callback Kullanımı:
function fetchData(callback) {
setTimeout(() => {
console.log("Veri alındı!");
callback();
}, 2000);
}
fetchData(function() {
console.log("Veri işlendi!");
});
Yukarıdaki örnekte, `fetchData` fonksiyonu asenkron olarak çalışır ve veri alındığında, verilen `callback` fonksiyonu çalıştırılır.
Promise: Callback’lerin Çağdaş Rakibi
Promise, callback’lere kıyasla daha okunabilir ve yönetilebilir bir asenkron yapıdır. Promise, bir işlemin gelecekte başarıyla tamamlanıp tamamlanmayacağına dair bir söz (promise) verir. Promise ile yapılan işlemler, "çözülmüş" (fulfilled), "reddedilmiş" (rejected) veya "beklemede" (pending) olabilir.
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("Veri alındı!");
resolve();
}, 2000);
});
}
fetchData().then(() => {
console.log("Veri işlendi!");
}).catch((error) => {
console.log("Bir hata oluştu!", error);
});
Burada, `fetchData` fonksiyonu bir Promise döner ve işlem tamamlandığında `resolve()` çağrılır. `then()` ve `catch()` metodları ile başarı ve hata durumları yönetilebilir.
Async/Await: Modern Çözüm
Son yıllarda async/await, JavaScript’in asenkron işlemlerini daha okunabilir ve yazılabilir hale getiren bir yapıdır. `async` anahtar kelimesi, bir fonksiyonun asenkron çalışacağını belirtirken, `await` anahtar kelimesi, bir Promise’in tamamlanmasını bekler. Bu yapı, kodunuzu senkron hale getirerek daha kolay anlaşılmasını sağlar.
async function fetchData() {
console.log("Veri alınıyor...");
await new Promise(resolve => setTimeout(resolve, 2000)); // 2 saniye bekle
console.log("Veri alındı!");
}
async function main() {
await fetchData();
console.log("Veri işlendi!");
}
main();
Bu örnekte, `fetchData` fonksiyonu asenkron bir işlem yapar ve `await` ile bekleme gerçekleştirilir. `main` fonksiyonu, tüm işlemleri sırasıyla çalıştırır.
Callback, Promise ve Async/Await Arasındaki Farklar
- Callback: Geleneksel asenkron yapıdır. Ancak karmaşık uygulamalarda callback hell sorunlarına yol açabilir.
- Promise: Daha okunabilir ve yönetilebilir asenkron işlemler sunar. Ancak, birçok Promise birbirine bağlıysa, kod uzun ve karmaşık olabilir.
- Async/Await: En modern ve en okunabilir çözümü sunar. Senkron tarzında yazılmış asenkron kodlar sayesinde hata ayıklama daha kolaydır.
- Callback: Basit ve kısa asenkron işlemler için uygundur.
- Promise: Birden fazla asenkron işlemi sırayla veya paralel olarak yönetmek için ideal bir çözümdür.
- Async/Await: En okunabilir ve yazılması en kolay asenkron kodu sağlar. Uzun vadeli projelerde ve karmaşık işlemlerle çalışırken tercih edilmelidir.