Promise ve Async/Await’in Temel Farkları
Promise'ler, gelecekte gerçekleşecek bir değeri temsil ederler. Başlangıçta "bekleyen" bir durumda olabilirler, sonra ya başarılı bir şekilde bir sonuç döndürebilirler ya da bir hata ile karşılaşabilirler. Bu yapının önemli bir avantajı, hataların daha yönetilebilir olması ve callback yapılarından kaçınılmasıdır.
Örnek olarak bir Promise'in nasıl çalıştığını düşünelim:
let promise = new Promise(function(resolve, reject) {
let success = true;
if(success) {
resolve("İşlem başarılı!");
} else {
reject("Bir hata oluştu!");
}
});
promise.then(function(value) {
console.log(value); // "İşlem başarılı!"
}).catch(function(error) {
console.log(error); // "Bir hata oluştu!"
});
Peki, async/await nedir? Async/await, Promise’leri daha temiz ve anlaşılır bir şekilde yazmamızı sağlar. Promise'lerin zihin karıştırıcı "then" ve "catch" zincirlerinden kaçınmamıza olanak tanır. Aslında, async/await yapısı, senkron kod yazıyormuş gibi bir deneyim sunar. Bu da kodumuzu daha okunabilir hale getirir.
Async/await kullanımı ise şu şekilde görünebilir:
async function fetchData() {
try {
let response = await fetch('https://api.example.com/data');
let data = await response.json();
console.log(data);
} catch (error) {
console.log('Bir hata oluştu:', error);
}
}
fetchData();
Buradaki en büyük fark, await kullanarak asenkron işlemi, senkron bir işlem gibi beklememizdir.
Zihinsel Modelleme ve Asenkron Yapılar
İlk adım, asenkron işlemi bir "bekleme" olarak görmektir. Bu, bir fonksiyon çalışmaya başladığında, diğer işlerin hala devam edebileceği anlamına gelir. Bu fonksiyon bir değeri döndürene kadar, uygulamanızın diğer bölümleri çalışmaya devam edebilir.
Örneğin, bir web sayfası veri alırken, diğer görsellerin yüklenmesini veya animasyonların çalışmasını sağlayabilirsiniz. Bu da kullanıcı deneyimini büyük ölçüde geliştirir.
Bunun için basit bir modelleme yapabilirsiniz. Kodu yazarken, hangi adımda beklememiz gerektiğine ve hangi adımda devam etmemiz gerektiğine karar verin. Bu zihinsel modelleme, daha verimli ve hatasız kodlar yazmanıza yardımcı olacaktır.
Callback Hell'den Kurtulmak
Callback Hell, genellikle şu şekilde görünebilir:
doSomething(function(result) {
doAnotherThing(result, function(newResult) {
doYetAnotherThing(newResult, function(finalResult) {
console.log(finalResult);
});
});
});
Bu tarz kodları görmek, gerçekten moral bozucu olabilir. Ama burada Promise yapıları devreye giriyor. Promise’ler, bu iç içe yapıyı basitleştirir ve kodu çok daha okunabilir hale getirir.
Async/await kullanarak callback hell’den nasıl kurtulacağımıza bakalım:
async function performTasks() {
let result = await doSomething();
let newResult = await doAnotherThing(result);
let finalResult = await doYetAnotherThing(newResult);
console.log(finalResult);
}
performTasks();
Gördüğünüz gibi, async/await kullanarak işlemleri sırasıyla, okunabilir ve daha temiz bir şekilde yazabiliyoruz.
Hata Yönetimi ve Debugging
Promise yapısında hata yönetimi için catch() fonksiyonu kullanılırken, async/await yapısında ise try/catch bloğu tercih edilir. Hata yönetimini doğru yaparak, uygulamanızın daha sağlam ve güvenilir olmasını sağlayabilirsiniz.
async function fetchData() {
try {
let response = await fetch('https://api.example.com/data');
let data = await response.json();
console.log(data);
} catch (error) {
console.error('Hata:', error);
}
}
Bu kodda, eğer bir hata meydana gelirse, bunu catch bloğunda yakalar ve anlamlı bir mesaj ile kullanıcıya sunarız.
Performans İpuçları
- Concurrency (Eşzamanlılık): Asenkron yapıları doğru kullanarak, işlemleri paralel olarak çalıştırabilirsiniz. Bu, özellikle ağ istekleri gibi zaman alıcı işlemlerde büyük bir avantaj sağlar.
- Promise.all: Birden fazla asenkron işlemi paralel olarak başlatmak için Promise.all() kullanabilirsiniz. Bu, işlemlerin aynı anda çalışmasını sağlar ve süreyi kısaltır.
async function fetchMultipleData() {
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());
}
Bu örnekte, iki veri setini aynı anda çekiyoruz ve böylece toplam bekleme süresini kısaltıyoruz.
---