Asenkron Programlamaya Giriş
Bu devrim niteliğindeki özellik, JavaScript’e bir çok yeni yazım tarzı ve yöntem kazandırdı. Bu yazıda, asenkron JavaScript'in evrimini inceleyeceğiz.
Callbacks: Başlangıcın Temelleri
Mesela bir dosya okuma işlemi düşünün. JavaScript'in senkron yapısında, dosya okunduktan sonra işlem tamamlanır ve sonra sıradaki işlemler yapılır. Ancak asenkron bir işlemde dosya okuma başlatılır ve okuma tamamlandığında callback fonksiyonu tetiklenir.
fs.readFile('dosya.txt', 'utf8', function(err, data) {
if (err) throw err;
console.log(data);
});
Bu kod parçasında, `readFile` fonksiyonu dosyayı okur ve okuma işlemi tamamlandıktan sonra callback fonksiyonu çalıştırılır. Ancak burada bir problem var. Callback'ler biriktiğinde, yani daha fazla işlem yapılmak istendiğinde, kod karmaşık ve yönetilmesi zor hale gelebilir. İşte bu noktada callback hell adı verilen bir durum ortaya çıkar.
Promises: Callbacks'ten Kurtulma
Örneğin, yukarıdaki callback örneğini Promise yapısına dönüştürmek şöyle olur:
const fs = require('fs').promises;
fs.readFile('dosya.txt', 'utf8')
.then(data => console.log(data))
.catch(err => console.log(err));
Yukarıdaki kodda, `fs.readFile` fonksiyonu artık bir Promise döndürüyor. `then()` metodu, işlem başarılı olduğunda çalıştırılırken, `catch()` hataları yakalar. Bu yöntem, kodu daha düzenli ve okunabilir hale getirir.
Async/Await: Modern JavaScript ve Okunabilirlik
Async fonksiyonları, bir Promise döndürür ve `await` operatörü, bir Promise'in sonucunu beklerken kodunuzu duraklatır. Bu, yazdığınız asenkron kodun senkron bir şekilde görünmesini sağlar.
Örnek olarak, yukarıdaki Promise örneğini async/await ile şu şekilde yazabiliriz:
async function dosyaOku() {
try {
const data = await fs.readFile('dosya.txt', 'utf8');
console.log(data);
} catch (err) {
console.log(err);
}
}
dosyaOku();
Burada, `await` ile `readFile` fonksiyonunun sonucunu bekliyoruz ve tüm asenkron kodu çok daha okunabilir hale getiriyoruz. `async/await` modern JavaScript'te genellikle en temiz çözüm olarak tercih edilmektedir.
Hangi Durumda Ne Kullanmalı?
- Callbacks: Küçük ve basit işlemler için iyidir, ancak büyük projelerde karmaşıklık yaratabilir.
- Promises: Daha büyük projeler ve zincirleme işlemler için daha yönetilebilir bir yapıdır.
- Async/Await: Kodun okunabilirliği ve bakımı için en modern ve kullanıcı dostu yaklaşımdır. Büyük projelerde ve karmaşık iş akışlarında önerilir.