1. Callback Hell’den Kurtulmanın Yolları
Promise kullanarak geri çağırmaları zincirleme bir şekilde yazabiliriz. Bununla birlikte, async/await kullanmak, kodu daha temiz ve anlaşılır hale getirecektir. Böylece asenkron kodları daha sıralı bir şekilde yazabiliriz.
async function getUserData(userId) {
try {
const user = await fetchUser(userId);
const posts = await fetchPosts(user.id);
const comments = await fetchComments(posts[0].id);
return { user, posts, comments };
} catch (error) {
console.error(error);
}
}
Burada, *async/await* yapısını kullanarak her şey çok daha temiz ve anlaşılır oldu. Callback hell’in o karmaşık yapısından kurtulduk!
2. Promise.all ve Promise.race Kullanımı ve Farkları
- Promise.all: Birden fazla Promise’in tümü tamamlandığında sonucu döner.
- Promise.race: İlk tamamlanan Promise’in sonucunu döner.
Örneğin, kullanıcı verisini ve posta verilerini paralel olarak almak istediğinizde:
const userPromise = fetchUser(1);
const postsPromise = fetchPosts(1);
const [user, posts] = await Promise.all([userPromise, postsPromise]);
Burada Promise.all kullanarak her iki veriyi paralel olarak alıyoruz ve bekliyoruz. Ancak, Promise.race kullanarak sadece ilk tamamlanan işlemi almak isterseniz:
const winner = await Promise.race([userPromise, postsPromise]);
console.log(winner);
Hangi yöntemi kullanacağınız, gereksinimlerinize göre değişebilir. Promise.all, her iki işlem tamamlandığında verilere erişmenizi sağlarken, Promise.race ile ilk tamamlanan işlemin sonucunu alabilirsiniz.
3. Async/Await ile Hata Yönetimini Güçlendirme
async function fetchData() {
try {
const data = await fetch("https://api.example.com/data");
const json = await data.json();
return json;
} catch (error) {
console.error("Veri alınırken bir hata oluştu: ", error);
}
}
Bu basit yapı, olası hataları yönetmek için oldukça etkili bir yöntemdir. Eğer bir hata oluşursa, kullanıcıyı bilgilendirebilir ve hatanın loglanmasını sağlayabilirsiniz.
4. Asenkron Kodun Test Edilmesi İçin İpuçları
test('fetchData() çalışmalı', async () => {
const data = await fetchData();
expect(data).toBeDefined();
expect(data).toHaveProperty('id');
});
Yukarıdaki örnekte, asenkron fonksiyonun düzgün çalışıp çalışmadığını kontrol ediyoruz. Böylece, kodumuzun doğru şekilde çalıştığından emin olabiliriz.
5. Async Iterators ve Streams ile Veri Yönetimi
Async iterators ile büyük veriyi okurken:
async function* fetchPostsInChunks() {
const posts = await fetch('https://api.example.com/posts');
const data = await posts.json();
for (let i = 0; i < data.length; i++) {
yield data[i];
}
}
for await (const post of fetchPostsInChunks()) {
console.log(post);
}
Burada, veriyi parçalara ayırarak her bir postu sırayla alıyoruz. Bu, büyük veri işlemlerini daha yönetilebilir ve verimli hale getirir.