Promise ve Async/Await Arasındaki Farklar
Öncelikle, "Promise" ve "Async/Await" arasındaki farkları anlamak, hata yapmamanın ilk adımıdır. Promise, asenkron işlemler için bir temsilci gibi davranır. Bu, bir işlemin sonucunun gelecekte ne olacağını tahmin etmene yardımcı olur. "Async/Await" ise, asenkron işlemleri senkron gibi yazmanı sağlar. Bu iki yapı, aynı amaca hizmet eder ama Async/Await, genellikle daha temiz ve okunabilir kod yazmanı sağlar.
const fetchData = async () => {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.error('Error fetching data:', error);
}
};
Burada, async/await kullanarak işlemi basitleştirdik. Kod, senkron bir işlem gibi akıyor, ancak aslında asenkron olarak çalışıyor. Bu, özellikle karmaşık asenkron zincirlerde büyük bir kolaylık sağlar.
Yaygın Hatalar ve Çözüm Yöntemleri
Geliştiricilerin sıkça karşılaştığı hata mesajlarından biri de "Unhandled promise rejection" hatasıdır. Bu hata, bir Promise'in beklenmedik bir şekilde reddedilmesi sonucu meydana gelir. Peki, bunu nasıl önleriz?
Promise yapısında, `.catch()` kullanarak hataları düzgün şekilde yakalayabilirsin. Async/Await yapısında ise, try/catch blokları işini kolaylaştırır. Bu yöntemleri kullanarak, asenkron işlemlerden kaynaklanan hataları etkili şekilde yönetebilirsin.
const fetchData = async () => {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error('Network response was not ok');
}
const data = await response.json();
console.log(data);
} catch (error) {
console.error('Error:', error);
}
};
# 2. Promises ile Zaman Aşımı
Bazen, bir Promise uzun süre tamamlanmazsa zaman aşımına uğrayabilir. Bu durumda, `setTimeout` gibi yöntemlerle zaman aşımı işlemi eklemek çok faydalı olabilir.
const fetchDataWithTimeout = () => {
return new Promise((resolve, reject) => {
const timeout = setTimeout(() => reject(new Error('Request timed out')), 5000);
fetch('https://api.example.com/data')
.then(response => {
clearTimeout(timeout);
return response.json();
})
.then(data => resolve(data))
.catch(error => reject(error));
});
};
Burada, zaman aşımı kontrolü ekleyerek işlemin belirli bir sürede tamamlanmaması durumunda hata fırlatıyoruz.
Performans İyileştirmeleri
Asenkron kod yazarken, performansı göz ardı etmek ciddi sorunlara yol açabilir. Özellikle büyük veri setleri veya ağ istekleriyle çalışırken, işlemleri daha verimli hale getirmek gerekir. İşte bazı ipuçları:
const fetchAllData = async () => {
const [users, posts] = await Promise.all([
fetch('https://api.example.com/users').then(res => res.json()),
fetch('https://api.example.com/posts').then(res => res.json())
]);
console.log(users, posts);
};
2. İç İçe Çalışan Promise'ler: Eğer işlemler sıralı olarak çalışacaksa, gereksiz yere zincirlemeyi ve aşırı `await` kullanmayı önleyebilirsin. Bu tür işlemleri optimize etmek, kodunun hızını artırır.
### Sonuç
JavaScript’in Promise ve Async/Await yapıları, asenkron kod yazmanın kolay ve güçlü yollarıdır. Ancak, doğru kullanılmadığında seni karmaşaya sürükleyebilir. Kodundaki hataları yakalamak, doğru zamanlama ve hata yönetimi stratejileri uygulamak, projelerinin güvenilirliğini artırır. Unutma, her zaman doğru hata yönetimini ve en iyi uygulamaları takip ederek JavaScript’in karmaşık yapılarıyla daha rahat başa çıkabilirsin.