1. `async/await`'in Yanlış Kullanımı
```javascript
// Yanlış kullanım:
const getData = () => {
const data = await fetch('https://api.example.com/data'); // Burada await kullanmak hatalı!
};
// Doğru kullanım:
const getData = async () => {
const data = await fetch('https://api.example.com/data'); // async fonksiyonu ile await kullanılabilir
};
```
`async` anahtar kelimesi, fonksiyonun asenkron çalışacağını belirtirken, `await` anahtar kelimesi de yalnızca asenkron fonksiyonlar içinde bekleme işlemi yapabilir. Bu yapıları doğru kullanarak hata yapmaktan kaçının.
2. Promise Hatalarını Etkin Şekilde Ele Alma
```javascript
fetch('https://api.example.com/data')
.then(response => response.json())
.catch(error => console.error('Hata oluştu:', error)); // Hata doğru şekilde yakalanmalı
```
Buradaki en yaygın hata, hataların sadece `try/catch` bloğunda yakalanması gerektiğini düşünmektir. Ancak Promise'lerde hata yönetimi için `.catch()` kullanmak daha etkili olabilir.
3. Asenkron Fonksiyonlarda Performans Hataları
```javascript
// Yanlış kullanım:
async function fetchData() {
const userData = await fetch('https://api.example.com/user');
const orderData = await fetch('https://api.example.com/orders');
}
// Doğru kullanım:
async function fetchData() {
const userPromise = fetch('https://api.example.com/user');
const orderPromise = fetch('https://api.example.com/orders');
const userData = await userPromise;
const orderData = await orderPromise;
}
```
Burada, `fetch` işlemlerini paralel hale getirerek zaman kazanabiliriz. Bu, özellikle çok sayıda asenkron işlemi yönetirken oldukça faydalıdır.
4. Event Loop ve Asenkron Fonksiyonlar
```javascript
console.log('Başlangıç');
setTimeout(() => {
console.log('Timeout bitti');
}, 1000);
console.log('Bitiş');
```
Yukarıdaki örneği çalıştırdığınızda, sırasıyla "Başlangıç", "Bitiş" ve "Timeout bitti" mesajlarını göreceksiniz. Bu durum, Event Loop'un zamanlayıcıları ve asenkron kodu nasıl ele aldığını gösterir.
5. Zamanlayıcılar ve Asenkron Fonksiyonlar
```javascript
// Yanlış kullanım:
setTimeout(() => {
// Zamanla ilgili bir işlem
}, 1000);
// Doğru kullanım:
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
async function example() {
console.log('Başlangıç');
await delay(1000); // 1 saniye bekle
console.log('Bitiş');
}
```
Buradaki fark, `setTimeout()` fonksiyonunun bir Promise ile sarmalanarak `await` ile kullanılabilmesidir. Bu, kodun okunabilirliğini arttırır.
6. Callbacks ile Asenkron Programlama
```javascript
// Callback:
doSomething((error, result) => {
if (error) {
console.log('Hata:', error);
} else {
console.log('Sonuç:', result);
}
});
// Promise:
doSomething()
.then(result => console.log('Sonuç:', result))
.catch(error => console.log('Hata:', error));
```
Promises, callback'lere göre daha temiz ve anlaşılır bir yapıya sahiptir. Hata yönetimi de daha kolaydır.
7. Asenkron Kodun Test Edilmesi
```javascript
// Test örneği
test('Veri çekme testi', async () => {
const data = await fetchData();
expect(data).toBeDefined();
});
```
async/await kullanılan fonksiyonlar testlerde de kolayca çalıştırılabilir. Jest gibi test araçları, asenkron kodları doğru bir şekilde test etmek için yerleşik desteğe sahiptir.