Async/Await Nedir ve Neden Kullanılır?
```javascript
async function fetchData() {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
}
```
Bu yapının temel avantajı, kodu sıralı ve anlaşılır hale getirmesidir. Yani, işlemlerinizin bitmesini beklerken diğer işlemleri engellemek yerine, bir sonraki satıra geçmek için bekleyebilirsiniz.
Performans Fırlatıcı Hatalar: Ne Zaman Async/Await Kullanmak Zarar Verebilir?
Örnek olarak, birden fazla asenkron işlemi ard arda beklemek, uygulamanızda ciddi performans kaybına yol açabilir.
```javascript
// Yanlış kullanım
async function fetchData() {
const user = await getUser();
const orders = await getOrders(user.id);
const products = await getProducts(orders);
console.log(products);
}
```
Burada, her await bir önceki işlemin tamamlanmasını bekler. Ancak, bu işlemler birbirinden bağımsız çalışabilir. Bu da gereksiz yere zaman kaybı anlamına gelir. Promise.all() ile bu durumu düzeltebilirsiniz.
```javascript
// Doğru kullanım
async function fetchData() {
const [user, orders, products] = await Promise.all([
getUser(),
getOrders(),
getProducts()
]);
console.log(products);
}
```
Burada, tüm işlemler eşzamanlı olarak çalıştırılır, bu da önemli ölçüde hız kazancı sağlar.
Zaman Yolculuğu ile Hızlı Geri Dönüşler: Async/Await'i Doğru Kullanmanın Yolları
Promise.race(), verilen promise’lerden sadece ilk tamamlanan işlemi bekler ve bu da özellikle zaman sınırlı işlemlerde büyük fark yaratabilir.
```javascript
// Örnek: En hızlı işlem bitene kadar bekle
async function fetchData() {
const fastest = await Promise.race([getData(), fetchDataFromCache()]);
console.log(fastest);
}
```
Burada, getData() ve fetchDataFromCache() işlemleri birbirinden bağımsız olarak başlar, ancak yalnızca en hızlı tamamlanan işlem sonucu alınır.
Async/Await ve Memory Leak: Hangi Durumlar Bellek Sızıntısına Yol Açar?
1. Unutulmuş Promise'ler: Eğer bir promise düzgün bir şekilde sonuçlanmazsa, bu bellekte bir sızıntıya yol açabilir.
2. Zamanlayıcılar: SetTimeout veya setInterval gibi fonksiyonlar, işlemi bitmeden önce başlatılmaya devam ederse bellek sızıntısına yol açabilir.
```javascript
// Bellek sızıntısı riski taşıyan bir örnek
async function fetchData() {
const response = await fetch('https://api.example.com/data');
// response düzgün bir şekilde işlenmezse, bellek sızıntısı meydana gelebilir.
const data = await response.json();
}
```
Bu tür durumları engellemek için try/catch bloklarını kullanarak hataları yönetebilirsiniz.
```javascript
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.error('Hata oluştu:', error);
}
}
```
Gerçek Dünya Örnekleri: Başarılı Async/Await Optimizasyonları
```javascript
async function getUserOrderHistory(userId) {
const [user, orders] = await Promise.all([
getUser(userId),
getOrders(userId)
]);
return { user, orders };
}
```
Bu yöntem, kullanıcı bilgilerini ve sipariş geçmişini eş zamanlı olarak getirerek çok daha hızlı bir sonuç almanızı sağlar.