Async/Await Eğitim Yazısı
1. Async/Await Nedir?
async
ve await
anahtar kelimeleri, JavaScript'te asenkron kod yazmayı daha okunabilir ve yönetilebilir hale getiren modern araçlardır.
async
işaretli bir fonksiyon, her zaman bir Promise
döner ve await
anahtar kelimesi ise bir Promise
'in sonucunu beklemek için kullanılır.
2. Async/Await Nasıl Çalışır?
Bir fonksiyon async
olarak işaretlendiğinde, bu fonksiyon içinde await
anahtar kelimesi kullanılabilir. await
, bir Promise
'in tamamlanmasını bekler ve tamamlandığında sonucu döndürür.
3. Kullanım Alanları
- Asenkron veri çekme işlemleri
- API çağrıları
- Veritabanı işlemleri
- Dosya okuma/yazma işlemleri
4. Örnekler
async function fetchData() {
let response = await fetch('https://jsonplaceholder.typicode.com/posts');
let data = await response.json();
console.log(data);
}
fetchData();
Açıklama: Bu örnek, fetch
fonksiyonunu kullanarak bir API'den veri çekiyor ve sonucu konsola yazdırıyor.
async function delayedMessage() {
console.log('Mesaj gönderildi');
await new Promise(resolve => setTimeout(resolve, 2000)); // 2 saniye bekle
console.log('Mesaj alındı');
}
delayedMessage();
Açıklama: Bu örnek, 2 saniye süren bir gecikme sonrası mesaj yazdırır.
async function fetchMultipleData() {
let user = await fetch('https://jsonplaceholder.typicode.com/users/1').then(res => res.json());
let posts = await fetch('https://jsonplaceholder.typicode.com/posts?userId=1').then(res => res.json());
console.log(user);
console.log(posts);
}
fetchMultipleData();
Açıklama: Bu örnek, bir kullanıcı ve onun yazdığı gönderileri çeker ve her iki sonucu da konsola yazdırır.
async function handleError() {
try {
let response = await fetch('https://jsonplaceholder.typicode.com/invalid-endpoint');
if (!response.ok) throw new Error('Network response was not ok');
let data = await response.json();
console.log(data);
} catch (error) {
console.error('Hata:', error);
}
}
handleError();
Açıklama: Bu örnek, bir hata yönetimi ile bir API çağrısının nasıl ele alınacağını gösterir.
async function asyncReturn() {
return 'Merhaba Dünya';
}
asyncReturn().then(message => console.log(message));
Açıklama: Bu örnek, async
fonksiyonunun nasıl bir Promise
döndürdüğünü ve sonucunun nasıl elde edildiğini gösterir.
async function waitForCondition() {
let conditionMet = false;
// Şart sağlanana kadar bekle
while (!conditionMet) {
await new Promise(resolve => setTimeout(resolve, 1000));
conditionMet = checkCondition(); // Bu fonksiyon bir şartı kontrol eder
}
console.log('Şart sağlandı!');
}
function checkCondition() {
return Math.random() > 0.8; // Örnek şart
}
waitForCondition();
Açıklama: Bu örnek, bir şart sağlanana kadar her saniye kontrol eden bir asenkron fonksiyon gösterir.
async function fetchDataWithTimeout(url, timeout) {
let controller = new AbortController();
let id = setTimeout(() => controller.abort(), timeout);
try {
let response = await fetch(url, { signal: controller.signal });
let data = await response.json();
return data;
} catch (error) {
if (error.name === 'AbortError') {
console.error('İstek zaman aşımına uğradı');
} else {
console.error('Hata:', error);
}
} finally {
clearTimeout(id);
}
}
fetchDataWithTimeout('https://jsonplaceholder.typicode.com/posts', 5000);
Açıklama: Bu örnek, bir API çağrısının zaman aşımı yönetimini gösterir.
async function exampleNestedAwait() {
let result1 = await new Promise(resolve => setTimeout(() => resolve('Sonuç 1'), 1000));
console.log(result1);
let result2 = await new Promise(resolve => setTimeout(() => resolve('Sonuç 2'), 1000));
console.log(result2);
}
exampleNestedAwait();
Açıklama: Bu örnek, ardışık await
kullanımı ile iki asenkron işlemi sırasıyla gösterir.
async function multipleAwait() {
let [data1, data2] = await Promise.all([
new Promise(resolve => setTimeout(() => resolve('Veri 1'), 2000)),
new Promise(resolve => setTimeout(() => resolve('Veri 2'), 1000))
]);
console.log(data1);
console.log(data2);
}
multipleAwait();
Açıklama: Bu örnek, birden fazla Promise
'in paralel olarak await
edilmesini gösterir.
async function exampleReturnValue() {
let value = await new Promise(resolve => setTimeout(() => resolve(42), 500));
return value;
}
exampleReturnValue().then(result => console.log(result));
Açıklama: Bu örnek, bir asenkron fonksiyonun nasıl bir değer döndürebileceğini gösterir.
async function exampleWithErrorHandling() {
try {
let data = await fetch('https://jsonplaceholder.typicode.com/posts/1').then(res => res.json());
console.log(data);
} catch (error) {
console.error('Hata:', error);
}
}
exampleWithErrorHandling();
Açıklama: Bu örnek, bir API çağrısının hata yönetimini gösterir.
async function sequentialRequests() {
let response1 = await fetch('https://jsonplaceholder.typicode.com/posts/1');
let data1 = await response1.json();
console.log('Post 1:', data1);
let response2 = await fetch('https://jsonplaceholder.typicode.com/posts/2');
let data2 = await response2.json();
console.log('Post 2:', data2);
}
sequentialRequests();
Açıklama: Bu örnek, ardışık iki API çağrısını gösterir.
async function fetchDataWithRetry(retries = 3) {
for (let i = 0; i < retries; i++) {
try {
let response = await fetch('https://jsonplaceholder.typicode.com/posts');
if (!response.ok) throw new Error('Network response was not ok');
let data = await response.json();
return data;
} catch (error) {
console.error('Hata:', error);
if (i === retries - 1) throw error;
}
}
}
fetchDataWithRetry().then(data => console.log(data));
Açıklama: Bu örnek, belirli sayıda deneme ile veri çekme işlemini gösterir.
async function parallelRequests() {
let [userResponse, postsResponse] = await Promise.all([
fetch('https://jsonplaceholder.typicode.com/users/1'),
fetch('https://jsonplaceholder.typicode.com/posts?userId=1')
]);
let user = await userResponse.json();
let posts = await postsResponse.json();
console.log(user);
console.log(posts);
}
parallelRequests();
Açıklama: Bu örnek, birden fazla API çağrısını paralel olarak gerçekleştirir.
async function fetchWithTimeout(url, timeout) {
let controller = new AbortController();
let timeoutId = setTimeout(() => controller.abort(), timeout);
try {
let response = await fetch(url, { signal: controller.signal });
let data = await response.json();
return data;
} catch (error) {
console.error('Hata:', error);
} finally {
clearTimeout(timeoutId);
}
}
fetchWithTimeout('https://jsonplaceholder.typicode.com/posts', 1000);
Açıklama: Bu örnek, belirli bir zaman aşımı süresi ile veri çekme işlemini gösterir.
async function retryFetch(url, retries) {
for (let attempt = 0; attempt < retries; attempt++) {
try {
let response = await fetch(url);
if (!response.ok) throw new Error('Network response was not ok');
let data = await response.json();
return data;
} catch (error) {
if (attempt === retries - 1) throw error;
}
}
}
retryFetch('https://jsonplaceholder.typicode.com/posts', 3)
.then(data => console.log(data))
.catch(error => console.error('Hata:', error));
Açıklama: Bu örnek, belirli bir sayıda denemeyle veri çekme işlemini gösterir.
async function fetchUserData() {
let response = await fetch('https://jsonplaceholder.typicode.com/users/1');
let user = await response.json();
console.log(user);
}
async function fetchPostData() {
let response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
let post = await response.json();
console.log(post);
}
async function fetchAllData() {
await Promise.all([fetchUserData(), fetchPostData()]);
}
fetchAllData();
Açıklama: Bu örnek, iki asenkron işlevin paralel olarak nasıl çalıştırıldığını gösterir.
async function fetchPostsWithDelay() {
let response = await fetch('https://jsonplaceholder.typicode.com/posts');
let posts = await response.json();
console.log(posts);
}
setTimeout(fetchPostsWithDelay, 2000);
Açıklama: Bu örnek, bir asenkron işlevin belirli bir gecikme ile nasıl çağrıldığını gösterir.
async function fetchDataWithDelay() {
let response = await fetch('https://jsonplaceholder.typicode.com/posts');
await new Promise(resolve => setTimeout(resolve, 2000)); // 2 saniye bekle
let data = await response.json();
console.log(data);
}
fetchDataWithDelay();
Açıklama: Bu örnek, veri çekme ve sonra gecikme ekleme işlemini gösterir.
async function processSequentialRequests() {
let result1 = await fetch('https://jsonplaceholder.typicode.com/posts/1').then(res => res.json());
console.log(result1);
let result2 = await fetch('https://jsonplaceholder.typicode.com/posts/2').then(res => res.json());
console.log(result2);
}
processSequentialRequests();
Açıklama: Bu örnek, iki ardışık API çağrısını ve sonuçlarını gösterir.
async function fetchDataInLoop() {
for (let i = 0; i < 3; i++) {
let response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
let data = await response.json();
console.log(`Veri ${i + 1}:`, data);
}
}
fetchDataInLoop();
Açıklama: Bu örnek, bir döngü içinde asenkron veri çekme işlemini gösterir.
async function fetchPostWithRetry() {
let attempts = 3;
while (attempts > 0) {
try {
let response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
let data = await response.json();
console.log(data);
break;
} catch (error) {
console.error('Hata:', error);
attempts--;
if (attempts === 0) throw error;
}
}
}
fetchPostWithRetry();
Açıklama: Bu örnek, bir API çağrısının belirli bir sayıda deneme ile nasıl yapılacağını gösterir.
async function fetchDataWithProgress() {
let progress = 0;
async function updateProgress() {
progress += 10;
console.log(`İlerleme: ${progress}%`);
if (progress < 100) {
await new Promise(resolve => setTimeout(resolve, 500)); // 0.5 saniye bekle
await updateProgress();
}
}
await updateProgress();
}
fetchDataWithProgress();
Açıklama: Bu örnek, bir işin ilerleme durumunu asenkron olarak günceller.
async function fetchDataWithDelayAndRetry() {
let maxRetries = 3;
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
let response = await fetch('https://jsonplaceholder.typicode.com/posts');
let data = await response.json();
console.log(data);
return data;
} catch (error) {
console.error('Hata:', error);
if (attempt === maxRetries - 1) throw error;
await new Promise(resolve => setTimeout(resolve, 1000)); // 1 saniye bekle
}
}
}
fetchDataWithDelayAndRetry();
Açıklama: Bu örnek, hem gecikme hem de yeniden deneme stratejisi ile veri çekmeyi gösterir.
async function fetchAndProcessData() {
let data = await fetch('https://jsonplaceholder.typicode.com/posts/1').then(res => res.json());
console.log('Veri alındı:', data);
let processedData = await processData(data);
console.log('İşlenmiş veri:', processedData);
}
async function processData(data) {
await new Promise(resolve => setTimeout(resolve, 1000)); // İşlem simülasyonu
return data;
}
fetchAndProcessData();
Açıklama: Bu örnek, veriyi çekip işlemek için asenkron fonksiyonların nasıl kullanılacağını gösterir.