Asenkron Kodun Gücü: JavaScript’in Sihri
Event Loop Nedir ve Nasıl Çalışır?
Örneğin, bir web sayfasında kullanıcı bir butona tıkladığında, JavaScript hemen bir işlem başlatabilir ama bu işlem bazen zaman alır (örneğin, veri çekme). Event Loop, bu bekleme süresince JavaScript’in başka işlemleri yapmasına izin verir. Ancak bu işlem tamamlandığında, Event Loop bekleyen işlemi çalıştırır.
Call Stack ve Callback Queue: İki Temel Kavram
Ancak, bir işlem tamamlandığında, bu işlem Callback Queue'ye eklenir. Callback Queue, işlemlerin sıraya girdiği yerdir ve Event Loop, Call Stack boş olduğunda bu kuyruğu kontrol eder. Eğer Call Stack boşsa, Event Loop sıradaki işleme geçer.
Bir Örnekle Event Loop’un Çalışmasını Anlamak
console.log('Başlangıç');
setTimeout(() => {
console.log('Zaman Aşımı Tamamlandı');
}, 0);
console.log('Bitiş');
Çıktı:
```
Başlangıç
Bitiş
Zaman Aşımı Tamamlandı
```
İlk bakışta, `setTimeout` fonksiyonunun hemen çalışması gerektiğini düşünebilirsiniz. Ancak, burada önemli bir nokta var: `setTimeout`, Callback Queue'ye bir iş ekler. Yani, zaman aşımı tamamlanmadan önce JavaScript, Call Stack’teki diğer işler biter ve ardından Callback Queue’den sıradaki işlemi alır.
Event Loop ile Asenkron Kodları Optimizasyon
# Promise Örneği:
console.log('Başlangıç');
new Promise((resolve, reject) => {
resolve('Promise Tamamlandı');
}).then(result => {
console.log(result);
});
console.log('Bitiş');
Çıktı:
```
Başlangıç
Bitiş
Promise Tamamlandı
```
Yine burada da `Promise` sırasıyla çalıştırılacak işler arasında yer alır ve Callback Queue’ye eklenir. JavaScript, Call Stack’teki işler bittikten sonra `Promise`’i işler.
Event Loop ile İlgili Sık Yapılan Hatalar
1. Yanlış Zamanlama: Asenkron bir işlem beklenenden önce çalışabilir.
2. Gecikmelerin Yönetilmesi: Zaman aşımını çok kısa tutmak, asenkron işlemlerin sırasıyla ilgili beklenmedik sonuçlara yol açabilir.
3. Callback Hell: İç içe geçmiş callback fonksiyonları, kodun karmaşık hale gelmesine yol açabilir.
Event Loop’u İyi Kullanmak
- Promise ve async/await kullanarak callback fonksiyonlarını sadeleştirin.
- Zaman alıcı işlemleri küçük parçalara ayırın, böylece Event Loop her bir adımda çalışabilir.
- setImmediate gibi farklı zamanlayıcıları kullanarak işlem sırasını optimize edin.
JavaScript’in Event Loop’unu tam olarak anlamak, uygulamanızın hızını artırabilir ve kullanıcı deneyimini iyileştirebilir. Her ne kadar karmaşık gibi görünse de, doğru yaklaşımla asenkron programlama güçlenir ve yazılım daha verimli hale gelir.