JavaScript’te asenkron işlemler, tarayıcıdaki veya Node.js ortamındaki olay döngüsü (event loop) mekanizması tarafından yönetilir. Bu mekanizma, JavaScript’in tek iş parçacıklı (single-threaded) yapısı içinde asenkron işlemleri etkili bir şekilde gerçekleştirmesine olanak tanır.
Olay Döngüsü (Event Loop) Nedir?
Olay döngüsü, JavaScript çalışma zamanı ortamında, ana iş parçacığının bloklanmadan kodu çalıştırmasına izin veren bir mekanizmadır. Bu, kullanıcı arayüzünün sorunsuz çalışmasını ve asenkron işlemlerin (örneğin, ağ istekleri, zamanlayıcılar) gerçekleştirilmesini sağlar.
Temel Asenkron Kavramlar
- Callback Fonksiyonları: Asenkron işlemler tamamlandığında çağrılmak üzere verilen fonksiyonlardır.
- Promises: Asenkron işlemlerin sonucunu temsil eden nesnelerdir.
resolve
vereject
fonksiyonları aracılığıyla başarılı veya başarısız sonuçları işler. - Async/Await: Promises ile çalışmayı daha okunabilir hale getiren, ES2017 ile tanıtılan bir sözdizimi şeklidir.
Asenkron İşlemlerin Çalışma Prensibi
Asenkron işlemler, olay döngüsü, iş kuyruğu (task queue), ve mikro görev kuyruğu (microtask queue) aracılığıyla yönetilir. Bu sürecin nasıl işlediğini anlamak için aşağıdaki adımları inceleyebiliriz:
- Call Stack (Çağrı Yığını): JavaScript, kodu çağrı yığınında çalıştırır. Her işlev çağrıldığında yığına eklenir ve tamamlandığında yığından çıkarılır.
- Web API’ler: Tarayıcı, setTimeout, DOM olayları, AJAX istekleri gibi işlevleri içeren Web API’ler sağlar. Bu işlevler çağrıldığında çağrı yığından çıkarılır ve tarayıcı tarafından yönetilir.
- Task Queue (İş Kuyruğu): Web API’ler tarafından tamamlanan asenkron işlemler, callback fonksiyonlarını iş kuyruğuna ekler. Bu callback’ler, çağrı yığını boşaldığında olay döngüsü tarafından işlenir.
- Microtask Queue (Mikro Görev Kuyruğu): Promises ve
process.nextTick
(Node.js) gibi mikro görevler, iş kuyruğundan önce işlenir. Mikro görev kuyruğu, olay döngüsünde her iş tamamlandığında kontrol edilir. - Event Loop (Olay Döngüsü): Olay döngüsü sürekli olarak çağrı yığını ve mikro görev kuyruğunu kontrol eder. Çağrı yığını boşaldığında, mikro görev kuyruğundaki görevler işlenir ve ardından iş kuyruğundaki görevler işlenir.
Örneklerle Açıklama
Callback Fonksiyonları ile Asenkron İşlem
console.log('Başlangıç'); setTimeout(function() { console.log('Asenkron işlem tamamlandı'); }, 2000); console.log('Bitiş');
Çıktı:
Başlangıç Bitiş Asenkron işlem tamamlandı
Bu örnekte, setTimeout
işlevi çağrıldığında tarayıcıya geçer ve 2 saniye sonra iş kuyruğuna callback fonksiyonunu ekler. Bu arada, “Bitiş” hemen yazdırılır ve ardından callback işlenir.
Promises ile Asenkron İşlem
console.log('Başlangıç'); let promise = new Promise((resolve, reject) => { setTimeout(() => { resolve('Promise tamamlandı'); }, 2000); }); promise.then((message) => { console.log(message); }); console.log('Bitiş');
Çıktı:
Başlangıç Bitiş Promise tamamlandı
Bu örnekte, Promise
oluşturulduğunda asenkron işlem başlar ve 2 saniye sonra resolve
fonksiyonu çağrılır. then
metodu ile bu resolve
çağrısını yakalarız ve mesajı yazdırırız.
Async/Await ile Asenkron İşlem
console.log('Başlangıç'); async function asyncFunction() { await new Promise((resolve) => { setTimeout(() => { resolve('Async/Await tamamlandı'); }, 2000); }); } asyncFunction().then((message) => { console.log(message); }); console.log('Bitiş');
Çıktı:
Başlangıç Bitiş Async/Await tamamlandı
Bu örnekte, asyncFunction
içinde await
kullanarak Promise
‘in tamamlanmasını bekleriz. Bu, daha okunabilir bir asenkron kod yazmamıza olanak tanır.
Sonuç
JavaScript’te asenkron işlemler olay döngüsü, iş kuyruğu, ve mikro görev kuyruğu aracılığıyla yönetilir. Callback fonksiyonları, Promises ve Async/Await gibi yapılar, bu işlemleri daha yönetilebilir hale getirir. Bu mekanizmalar, JavaScript’in tek iş parçacıklı yapısında yüksek performanslı asenkron işlemleri gerçekleştirmesini sağlar.