Asynchronous Function Timeout Nedir?
Örneğin, bir API'den veri çekerken, o API'nin yanıt vermesi beklediğinizden daha uzun sürdüğünde, bu "timeout" hatası devreye girer. Asenkron fonksiyonun belirli bir süre içinde işlem tamamlanmazsa, hata mesajı alırsınız ve bu işlem sonlandırılır.
Hata Mesajı Ne Anlama Geliyor?
```bash
Error: Timeout of 5000ms exceeded
```
Bu mesajda, belirtilen süre (5000ms veya 5 saniye) içinde işlemin tamamlanamaması nedeniyle hata oluşmuştur. Bunun anlamı şudur: Kodunuz, dış bir kaynağa bağlanmaya çalışıyor veya bir işlem gerçekleştiriyor, ancak bu işlem belirli bir süre zarfında bitmiyor ve bu yüzden program hata veriyor.
Timeout Hatasının Nedenleri
2. Veritabanı Sorguları: Uzun süren veritabanı sorguları da zaman aşımına yol açabilir. Özellikle büyük veri kümeleriyle çalışırken bu tür sorunlar sıkça yaşanır.
3. İnternet Bağlantısı: Eğer dış bir servise internet üzerinden bağlanıyorsanız, bağlantı hızı yavaşsa ya da servis geçici olarak offline durumdaysa, timeout hatası alabilirsiniz.
4. Yanıt Bekleyen Asenkron Kodlar: Yanıt almak için bekleyen bir asenkron fonksiyon, bazen beklenenden çok daha uzun süre çalışabilir ve timeout hatası almanıza yol açar.
Çözüm Yolları
# 1. Zaman Aşımı Süresini Artırma
```javascript
const axios = require('axios');
axios.get('https://example.com/api', { timeout: 10000 }) // 10 saniye
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error('Hata:', error);
});
```
Yukarıdaki örnekte, axios kullanarak API'den veri çekerken zaman aşımı süresi 10 saniyeye çıkarıldı. Bu, işlem tamamlanana kadar daha fazla zaman tanıyacaktır.
# 2. Asenkron Kodların Verimli Yazılması
```javascript
const fetchData = async () => {
try {
const data = await Promise.race([
fetch('https://example.com/data'),
new Promise((_, reject) => setTimeout(() => reject('Zaman aşımı!'), 5000)) // 5 saniye timeout
]);
console.log(await data.json());
} catch (error) {
console.error(error);
}
};
fetchData();
```
Burada `Promise.race()` kullanarak, ya veriyi almayı ya da 5 saniyelik timeout hatasını yakalamayı deniyoruz. Bu yaklaşım, uygulamanın daha sağlam olmasına yardımcı olabilir.
# 3. Retry Mekanizması Eklemek
```javascript
const axios = require('axios');
async function fetchDataWithRetry(url, retries = 3) {
for (let i = 0; i < retries; i++) {
try {
const response = await axios.get(url);
return response.data;
} catch (error) {
if (i === retries - 1) throw error; // Son denemede hata fırlat
console.log('Tekrar deniyorum...');
}
}
}
fetchDataWithRetry('https://example.com/api')
.then(data => console.log(data))
.catch(error => console.error('Hata:', error));
```
Bu örnekte, 3 defa denemeye çalışıyoruz. Eğer 3 denemede de sonuç alamazsak, son olarak hata mesajı verilir.
# 4. İyi Bir Error Handling Yapısı Kurun
```javascript
const axios = require('axios');
axios.get('https://example.com/api', { timeout: 5000 })
.then(response => {
console.log(response.data);
})
.catch(error => {
if (error.code === 'ECONNABORTED') {
console.error('API bağlantısı zaman aşımına uğradı');
} else {
console.error('Genel hata:', error.message);
}
});
```
Burada hata türünü kontrol edip, spesifik olarak `ECONNABORTED` hata kodu ile timeout hatalarını daha net bir şekilde işliyoruz.