Asenkron işlemleri yönetmenin geleneksel yolu olan *callback* fonksiyonları, karmaşıklaştıkça karmaşıklığa neden olabilir. İşte burada *async* ve *await* devreye girer. Bir fonksiyonun önüne *async* anahtar kelimesini eklemek, o fonksiyonun asenkron olmasını sağlar. Ardından, asenkron işlemlerin beklenmesini sağlamak için *await* kullanılır. Bu sayede, kod sırasıyla çalışırken, beklenen işlemlerin sırasını düzenlemiş oluruz.
Örnek Kod:
async function getData() {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data;
}
Asenkron işlemlerde, hata yönetimi önemlidir. Eğer bir hata oluşursa, kodunuz durabilir veya beklenmedik sonuçlar doğurabilir. İşte bu noktada, *try/catch* blokları devreye girer. *Await* edilen her işlem, *try* bloğunun içinde yer almalı ve hata durumunda *catch* bloğunda ele alınmalıdır.
Örnek Kod:
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('Bir hata oluştu:', error);
}
}
Her asenkron işlem, tek tek sırasıyla beklemek yerine paralel olarak gerçekleştirilebilir. Eğer birbirine bağımlı olmayan birden fazla asenkron işlem yapıyorsanız, bunları *Promise.all()* yöntemiyle paralel hale getirebilirsiniz. Bu sayede, işlemler birbiriyle beklemeden aynı anda çalışabilir.
Örnek Kod:
async function getMultipleData() {
const [data1, data2] = await Promise.all([
fetch('https://api.example.com/data1'),
fetch('https://api.example.com/data2')
]);
console.log(await data1.json());
console.log(await data2.json());
}
Async/Await, yazdığınız kodu çok daha temiz ve okunabilir hale getirir. Kodunuz daha anlaşılır ve modüler olur. Bu, özellikle büyük projelerde çok faydalıdır çünkü asenkron kodun sırayla çalıştırılması gerektiği için hata yapma ihtimali de azalır. Ayrıca, aynı işlem birden fazla yerde kullanıldığında kod tekrarı olmadan işleri daha verimli yapabilirsiniz.
Bazı işlemler, beklenmedik şekilde uzun sürebilir. Bu tür işlemleri *timeout* ile sınırlamak faydalı olabilir. JavaScript'te zaman aşımı işlemi için, belirli bir süre sonra işlemi durduracak kodlar yazabilirsiniz.
Örnek Kod:
function timeout(ms) {
return new Promise((_, reject) => setTimeout(() => reject('Zaman aşımı!'), ms));
}
async function fetchDataWithTimeout() {
try {
const data = await Promise.race([
fetch('https://api.example.com/data'),
timeout(5000)
]);
console.log(await data.json());
} catch (error) {
console.error(error);
}
}