Asenkron Programlama Nedir?
Öncelikle, asenkron programlamayı anlayalım. Düşünün ki bir web sayfası açıyorsunuz ve sayfa, veri çekmek için bir API’ye başvuruyor. Eğer JavaScript, bu veriyi almak için sayfa yüklemesini bekleseydi, sonuç olarak sayfa çok uzun süre donmuş olurdu. İşte asenkron programlama, tam burada devreye giriyor. JavaScript, veri alırken diğer işlemlere devam eder ve veri geldiğinde bize bildirir. Bu sayede kullanıcı deneyimi hiç aksamadan devam eder.
İlk asenkron yapımız callback fonksiyonlarıdır. Callback, başka bir fonksiyonun parametresi olarak geçen ve iş tamamlandığında çağrılan fonksiyondur. Fakat callback kullanmanın bazı dezavantajları vardır. Bu "callback hell" olarak adlandırılır. Yani, eğer bir callback içinde başka bir callback varsa, işler karmaşıklaşır ve kod okunabilirliği zorlaşır.
Örnek bir callback fonksiyonu şöyle olabilir:
function veriCek(callback) {
setTimeout(function() {
console.log("Veri alındı!");
callback();
}, 2000);
}
veriCek(function() {
console.log("Callback tamamlandı.");
});
Yukarıdaki örnekte, `veriCek` fonksiyonu, veriyi aldıktan sonra callback fonksiyonunu çağırıyor. Ancak, iki veya daha fazla callback çağırmaya başladığınızda, işin içinden çıkmak zorlaşıyor.
Promiseler: Temiz ve Okunabilir
Promiseler, callback'lerin verdiği karmaşıklığı çözmek için ortaya çıktı. Bir promise, bir işlemin sonunda dönecek olan değeri temsil eder. Yani, veri henüz gelmemişse, promise "bekleniyor" durumundadır. Veri geldiğinde ise "tamamlandı" ya da "hata" olarak işaretlenir.
let veriCekPromise = new Promise(function(resolve, reject) {
setTimeout(function() {
let veri = "Veri alındı!";
if (veri) {
resolve(veri);
} else {
reject("Veri alınamadı.");
}
}, 2000);
});
veriCekPromise.then(function(value) {
console.log(value);
}).catch(function(error) {
console.log(error);
});
Burada, promise `resolve` fonksiyonu ile başarılı bir şekilde veri döner veya `reject` fonksiyonu ile hata mesajı gönderir. Daha temiz ve yönetilebilir bir yapıdır.
Async/Await: Daha İleri Düzey
Son olarak, async/await yapısı, promiselerin kullanımını daha da sadeleştiriyor. Aslında async/await, promise yapılarının üzerine inşa edilmiştir ve onları daha okunabilir hale getirir. `async` ile fonksiyonu işaretlersiniz ve `await` ile bir promise’in sonuçlanmasını beklerken kodu durdurabilirsiniz.
async function veriCekAsync() {
let veri = await veriCekPromise;
console.log(veri);
}
veriCekAsync();
Gördüğünüz gibi, `await` sayesinde kod daha anlaşılır hale geliyor. Kodun sırası korunuyor, bu da hata ayıklama sürecini daha kolaylaştırıyor.
Hangisini Ne Zaman Kullanmalıyız?
Şimdi büyük soru: "Hangi yapıyı ne zaman kullanmalıyım?"
- Callback'ler genellikle küçük projelerde veya eski JavaScript kodlarında kullanılabilir. Ancak büyüdükçe karmaşıklık yaratabilir.
- Promiseler, daha temiz ve okunabilir kod yazmanızı sağlar. Genellikle birden fazla asenkron işlem yapmanız gerektiğinde daha uygun olur.
- Async/Await, promiselerin sunduğu tüm avantajları alır ve bir adım daha ileriye götürür. Modern JavaScript ile çalışıyorsanız, async/await çoğu durumda en iyi tercihtir.
Asenkron programlama, JavaScript’teki en önemli konulardan biridir ve doğru kullanılan yapılar, yazılım geliştirme sürecinizi çok daha verimli hale getirebilir. Callback, promise ve async/await arasındaki farkları öğrendikten sonra, proje ihtiyaçlarınıza göre en uygun çözümü seçebilirsiniz.
Unutmayın, her şeyin en iyisi doğru zamanda doğru aracı kullanmaktır!