Asenkron Programlama Nedir?
Callback’ler: İlk Adım
Örnek bir Callback kullanımına bakalım:
function veriAl(callback) {
setTimeout(() => {
console.log("Veri alındı!");
callback();
}, 2000);
}
function islemYap() {
console.log("İşlem yapılıyor...");
}
veriAl(islemYap);
Burada `veriAl` fonksiyonu, 2 saniye sonra veri aldığını simüle ediyor ve ardından `islemYap` fonksiyonunu çağırıyor. Bu yöntem basit olsa da, kodun daha karmaşık hale gelmesi durumunda callback hell adı verilen, birbirine bağlanmış çok sayıda callback fonksiyonuyla karşılaşmak mümkün.
Promise’ler: Callback’lere Güzel Bir Alternatif
Bir Promise oluşturmak oldukça basittir:
function veriAlPromise() {
return new Promise((resolve, reject) => {
setTimeout(() => {
let success = true;
if (success) {
resolve("Veri başarıyla alındı!");
} else {
reject("Veri alınamadı.");
}
}, 2000);
});
}
veriAlPromise()
.then((message) => console.log(message))
.catch((error) => console.log(error));
Bu örnekte, `veriAlPromise` fonksiyonu bir Promise döndürür. `resolve` çağrıldığında işlem başarıyla tamamlanır, `reject` ise hata durumunda devreye girer. `.then` ve `.catch` ile başarılı ve başarısız durumlar yönetilebilir. Promise’ler, özellikle karmaşık asenkron işlemler için çok daha temiz ve okunabilir bir yapıdır.
Async/Await: Modern JavaScript’in En Güçlü Araçları
async function veriAlAsync() {
let message = await veriAlPromise();
console.log(message);
}
veriAlAsync();
Burada `veriAlAsync` fonksiyonu, `await` anahtar kelimesiyle Promise'in tamamlanmasını bekler. Async/Await, hem okunabilirliği artırır hem de kodun daha doğal bir şekilde yazılmasını sağlar. Bu, özellikle büyük projelerde ve karmaşık asenkron işlemlerde büyük bir avantaj sağlar.
Hangi Durumda Ne Kullanılmalı?
- Callback: Basit ve hızlı çözümler için kullanılır. Ancak, çok fazla iç içe callback olduğunda kodun karmaşıklığı artar.
- Promise: Asenkron işlemlerin daha iyi yönetilmesini sağlar. Özellikle zincirleme işlemler ve hata yönetimi için idealdir.
- Async/Await: Modern JavaScript projelerinde önerilen yöntemdir. Daha temiz ve okunabilir kod sağlar. Karmaşık asenkron işlemler için en iyi tercihtir.
En İyi Kullanım Senaryoları
- Promise’ler: Asenkron işlemlerin yönetilmesinde daha düzenli ve daha kontrol edilebilir bir yapıdır. Zincirleme ve hata yönetimi konusunda idealdir.
- Async/Await: Modern JavaScript uygulamalarında tercih edilen en iyi yaklaşımdır. Özellikle API istekleri, dosya okuma/yazma işlemleri gibi karmaşık asenkron işlemler için uygundur.