Async/Await nedir?
- Async fonksiyonu, fonksiyonun geri dönüş değerini her zaman bir Promise olarak döner. Yani, async bir fonksiyon çağırdığınızda, bu fonksiyon size bir promise objesi döndürür.
- Await ise sadece async fonksiyonlar içinde çalışır ve promise'in tamamlanmasını bekler.
Örnek olarak:
async function getData() {
let response = await fetch('https://api.example.com/data');
let data = await response.json();
return data;
}
Yukarıdaki örnekte, `await` anahtar kelimesi, fetch işleminin tamamlanmasını bekler ve ardından devam eder. Bu, kodun sıralı şekilde çalışmasına yardımcı olur.
Promise nedir ve nasıl çalışır?
Örnek:
function getData() {
return fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => data)
.catch(error => console.error(error));
}
Bu örnekte, `fetch` fonksiyonu bir promise döner ve işlem tamamlandığında `.then()` bloğu çalışır. Hata durumunda ise `.catch()` bloğu devreye girer.
Async/Await ile Promise arasındaki temel farklar
- Okunabilirlik ve Temizlik: Async/Await, kodu daha okunabilir hale getirir. Çünkü işlemlerin sırasıyla yazılmasını sağlar. Promise ise zincirleme `.then()` kullanımı gerektirdiği için daha karmaşık hale gelebilir.
- Hata Yönetimi: Async/Await, try/catch bloğu ile hata yönetimi yapmayı sağlar, bu da hata yönetimini çok daha temiz ve kolay hale getirir. Promise'te ise `.catch()` kullanmak gerekir.
- Zincirleme İşlemler: Promise, birden fazla asenkron işlemi sıralı şekilde yapmanızı sağlar. Ancak, async/await de sıralı işlem yapabilse de, tek tek adımları yazmak daha doğal bir hale gelir.
Her birinin kullanım senaryoları ve avantajları
- Okunabilirlik: Kodun daha temiz ve anlaşılır olmasını sağlar. Özellikle iç içe asenkron işlemler varsa, async/await ile daha net bir yapı elde edilir.
- Hata Yönetimi: Try/catch ile daha merkezi bir hata yönetimi yapılabilir.
- Performans: Genellikle, async/await'in performansı promise zincirlerine göre daha iyidir, çünkü async/await işlemleri daha düzgün bir sıralama ile gerçekleştirilir.
- Promise:
- Esneklik: Promise, birden fazla asenkron işlemi zincirleme yapmanıza imkan tanır. Büyük projelerde bazı durumlarda daha esnek bir yapı oluşturabilir.
- Kodun Modülerliği: Promise, her bir asenkron işlemi daha modüler hale getirir. Kendi başına bir promise döndürüp, sonra bu promise'i başka bir fonksiyona verebilirsiniz.
Kod örnekleri ile açıklamalar
async function fetchUserData(userId) {
try {
let response = await fetch(`https://api.example.com/users/${userId}`);
let userData = await response.json();
console.log(userData);
} catch (error) {
console.error('Hata:', error);
}
}
Bu kodda, `await` ile `fetch` işleminin tamamlanmasını bekliyoruz. Eğer herhangi bir hata olursa, `catch` bloğuna düşer.
Bir diğer örnekte ise Promise kullanarak aynı işlemi gerçekleştirelim:
function fetchUserData(userId) {
fetch(`https://api.example.com/users/${userId}`)
.then(response => response.json())
.then(userData => console.log(userData))
.catch(error => console.error('Hata:', error));
}
Burada, `.then()` ile işlem sonucu alınıp işlenirken, `.catch()` ile hata yönetimi yapılır.
Async/Await kullanmanın en iyi uygulamaları
2. Hata Yönetimi Yapın: Her zaman `try/catch` bloğu ile hata yönetimi yapın. Bu, kodunuzu güvenli hale getirecek ve olası hatalarla başa çıkmanıza yardımcı olacaktır.
3. Promise.all ile Paralel İşlemler: Birden fazla asenkron işlemi paralel olarak çalıştırmanız gerekiyorsa, `Promise.all()` kullanarak bu işlemleri daha verimli hale getirebilirsiniz.