JavaScript geliştiricisi olmanın güzelliklerinden biri, her gün yeni bir şey öğrenmek ve problemleri çözmek. Ancak, her yazılımcının başına gelen bir kabus var: asenkron hatalar. Evet, yanlış duymadınız! Asenkron işlemler, zaman zaman geliştiricilerin başını ağrıtan, karmaşık ve oldukça sinir bozucu hatalar yaratabiliyor. Ama endişelenmeyin! Çünkü bu yazı tam da size bu karanlık yüzü aydınlatacak, ve JavaScript'in gizemli asenkron dünyasında kaybolmamanız için gerekli olan çözümleri sunacak.
Asenkron Hataların Arkasında Ne Var?
Bir asenkron hata, genellikle beklenmedik bir şekilde ortaya çıkar ve hata mesajları, genellikle çözümden çok kafa karıştırıcı olabilir. Geliştiriciler, "Ne anlama geliyor bu hata?" diye düşünerek saatlerce uğraşmak zorunda kalabilirler. Ama üzülmeyin! Bu yazıda, asenkron hataların nasıl önlendiğini ve nasıl düzeltildiğini öğreneceksiniz.
Hata 1: `Unhandled Promise Rejection`
```javascript
let promise = new Promise((resolve, reject) => {
reject('Bir hata oluştu!');
});
promise.then(result => {
console.log(result);
}).catch(error => {
console.log(error);
});
```
Yukarıdaki örnekte, `reject` kullanılarak hata meydana getirilmiştir, ancak bu hata doğru bir şekilde yakalanmamış. Bunun yerine, `.catch()` ile hatayı yakalayarak işlem yapmak gerekir.
Hata 2: `async` Fonksiyonlarında `await` İle Yapılan Yanlış Kullanımlar
```javascript
async function getData() {
let response = await fetch('https://jsonplaceholder.typicode.com/posts');
let data = await response.json(); // Bu satırda hata olabilir!
console.log(data);
}
getData();
```
Yukarıdaki örnekte, `response.json()` metodunu `await` ile kullanıyoruz, ancak eğer `response` geçerli bir JSON verisi döndürmezse, burada bir hata oluşacaktır. Bu tür hataları, `try/catch` bloklarıyla kontrol edebilirsiniz.
```javascript
async function getData() {
try {
let response = await fetch('https://jsonplaceholder.typicode.com/posts');
let data = await response.json();
console.log(data);
} catch (error) {
console.log("Bir hata oluştu: ", error);
}
}
getData();
```
Hata 3: `Promise.all` ve Paralel Asenkron İşlemler
```javascript
let promise1 = fetch('https://jsonplaceholder.typicode.com/posts');
let promise2 = fetch('https://jsonplaceholder.typicode.com/users');
Promise.all([promise1, promise2])
.then(results => {
console.log(results[0], results[1]);
})
.catch(error => {
console.log("Bir hata oluştu: ", error);
});
```
Burada, her iki `fetch` işlemi paralel olarak yapılır ve hata olursa, bu hata her iki işlem için de geçerli olur. Hatalar bu şekilde yönetildiğinde kod daha stabil hale gelir.
Hata 4: `setTimeout` ve `Promises`’ın Karmaşası
```javascript
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function testDelay() {
console.log("Başlangıç");
await delay(2000);
console.log("2 saniye sonra");
}
testDelay();
```
Burada, `setTimeout` fonksiyonunu bir `Promise` ile sararak asenkron hale getirdik. Bu sayede, bekleme sürelerini daha kontrollü bir şekilde yönetebiliriz.