Asenkron (Asynchronous) Programlama

Yüşa Oruç
3 min readSep 19, 2022

--

Herkese merhaba, ilk yazımda sizlere Asenkron (Asynchronous) Programlama nedir, neden kullanılır ve genel yapısını bildiğim şekilde aktarmaya çalışacağım. Keyifli okumalar dilerim.

Asenkron (Asynchronous) Programlama Nedir?

Senkron programlamadaki her şeyi sırayla işlemesi ve her bir işlemin birbirini beklemesi yeri geldiğinde programımızı çok yavaşlatabilir, hatta işlem bitene kadar durdurabilir. Her yazdığımız kod bloğu aynı sürede çalışmayabilir ve istenilen sonuç farklı şekillerde yanlış alınabilir ama bunu değiştirmenin yani istenilen sırada çalışmasını sağlayabilmemizin avantajını bize Asenkron Programlama sağlıyor diyebiliriz. Kod akışının sırayla işlemediği, işlemlerin birbirini beklemediği, kod akışının işlem durumlarına göre devam ettiği programlamaya Asenkron Programlama denir.

JavaScript Asenkron mu Yoksa Senkron mu Çalışır?

Senkron dediğimiz kavram şudur: Kodlar yukarıdan aşağıya doğru sırayla işlenir ve bir satırdaki işlem bitmeden diğer satıra geçilmez.
Asenkron yapıda ise uzun zaman alan veya farklı görevdeki işlemler aynı anda gerçekleştirilir.
Single-thread: Javascript Engine aynı anda sadece bir iş yapar. Tüm işlemler tek thread üzerinden yürütülür ayrıca bu thread’de aynı anda sadece bir işlemci çekirdeği üzerinde çalışabilir.
Javascript single-thread ve asenkron yapıda çalışan bir programlamadır. Javascript single-thread çalıştırma yaptığı için ( Yani satır satır çalışır ve bir satır execute edilip işlem tamamlanmadan diğerine geçmez.) çalıştırdığı eventleri ve callback leri sıraya sokarak hepsini tek bir thread ile işler. Bahsedilen Event’lerin ve Callback’lerin sırada tutulduğu yapı, basit bir kuyruk (Queue) mekanizmasıdır. Thread’in her defasında kuyruktaki ilk Event’i işleyip yeni bir Event alması da Event Loop olarak adlandırılır. Javascript Run-to-Completion adı verilen, elindeki işi tamamlamadan başka bir işe geçmeyen bir mekanizmaya sahiptir.

JS Runtime ekran görüntüsünü paylaşmış olduğumuz kod bloğunu derlemeye başlar başlamaz bu fonksiyonun 2. Satırından itibaren Event kuyruğuna bir Event bırakır. Thread, bu Event’in sırası geldiğinde kodu 2. Satırından itibaren koşturur ve konsolumuza “birinci console” yazısını bastırır. Sonrasında, 3. Satırımızda ki olan setTimeOut çağrısını, Event Queue’ya bir Event bırakır ve 6. Satırımıza geçerek konsolumuza “üçüncü console” yazısını bastırır ve bu sayede ilk Event’in Handling’i bitmiş olur. Thread ilk döngüyü bitirdikten sonra, Event Loop içinde kuyruğa bakar ve kuyruktaki setTomeout Event’ini alır ve işlemeye başlar. Konsolumuza son olarak “ikinci console” yazısını bastırır ve işlemi bitirir.

Burada ki konu başlığımızın altında Senkron, Asenkron yapıyı ve JavaScript’in çalışma mantığını anladığımıza göre (umarım hepimiz için öyledir 😊 ) bir sonra ki konumuza geçelim.

JavaScript’te Async ve Await Nedir?

Async ile JS Runtime’a bu işlemin asenkron bir işlem olacağını önceden haber veriyoruz ve await ile bu işlemi tamamlamadan diğer işleme geçmemesini söylüyoruz. Yani async yazan bir fonksiyonda await gördüğümüz bir yerde bilmeliyiz ki senkron bir yapı değil asenkron bir yapı var ve bu asenkron yapı await yazan yerde ki fonksiyonun, işlevin çalışmasını ve bu işlemi bitirdikten sonra ilerleyeceğini bilmeliyiz.

Peki bu async ve await kod bloğu üzerinde nasıl kullanılıyor?

Yukarıdaki örnekte görüldüğü gibi fonksiyonumuzun asenkron yapıda olduğu önceden haber veriliyor ve tamamlamasını beklemek istediğimiz işlemimize await ekleyerek bitirmeden geçmemesi gerektiğini söylemiş oluyoruz.

Bu hali ile console çıktımız “birinci console”, “ikinci console” ve “üçüncü console” şeklinde olacaktır.

Bu yapıyı daha iyi anlamak adına hayatımızdan bir örnek ile açıklamak istiyorum.

Bir sürahi düşünelim ve bardağa su dolduracağız fakat ilk öncelikle komple bu işlemin senkron değil de asenkron olduğunu ve şunu düşünelim, sürahimizin içi boş. Sürahi komple dolduktan sonra bardağa su dolduracağız. Şimdi burada ilk öncelikle Sürahinin dolmasını bekleyip ardından bardağa su dolduracağız. Fakat sürahimizin dolmasını beklemeden su doldurmaya geçersek bardağımız dolmayacak ve suyumuz bardağa eklenmiş olmayacak. Kısaca; Sürahiyi elimize aldığımızda sürahinin dolmasını söylüyoruz (async) daha sonra sürahimiz dolana kadar sürahinin başından ayrılmaması gerektiğini belirtiyoruz (await).

Kod Yazarken Kullanılabilecek Yerler

Elimizde bir fonksiyon var ve bu fonksiyon içinde bir api’ye istek atıyoruz. Gelen cevabı bir değişkene attığımız ve bu değişkeni de ekrana yazdırıyoruz. JS Runtime bizim ilk fonksiyonumuzu okudu ve api’ye isteğini attı ama cevabı beklemeden diğer fonksiyonumuza geçti ve cevabımızı değişkene yazdırıp ekranda göstermek istedi sonuç olarak “expansion is not defined” hatasını alırız. Bu gibi hataların önüne geçmek için async/await kullanıyoruz.

Sağlıcakla kalın…

Umarım beğenmişsinizdir :))

--

--

Yüşa Oruç

Selamlar herkese, kısaca özetlemek gerekirse heyecanlı, girişken ve özgüvenli bir yazılımcı olma yolunda ilerleyen nevi şahsına münhasır bir şahıs…