Hazırlayan: Yusuf YEŞİL - 22430070061
Asenkron işlemler, programın akışını durdurmadan arka planda gerçekleşen işlemlerdir.
Asenkron programlama için gündelik hayattan örnek vermek gerekirse, restoranlar güzel bir örnek olacaktır. Öğle vakti işten veya dersten erken çıktığınızı, çok acıktığınızı ve bir restorana gittiğinizi düşünün. İçeriye girdiniz ve boş olan herhangi bir masaya oturdunuz. Sizinle ilgilenmek için bir garson masanıza geldi. Size ne yemek istediğinizi sordu ve siz de yemek siparişinizi verdiniz. Garson vermiş olduğunuz siparişi aldı, mutfaktaki şefe iletti ve şef vermiş olduğunuz siparişi yardımcılarıyla birlikte hazırlamaya başladı. Garson siparişi mutfaktaki şefe iletirken restorana yeni bir müşteri girdi daha sonra bir müşteri daha, bir müşteri daha... Böyle böyle sayısız müşteri öğle arası olması nedeniyle girmeye devam etti. Garson da gelen tüm müşterilerin siparişlerini almaya devam etti ve bu siparişleri de mutfaktaki şefe iletti. Diğer müşterinin siparişini ilettikten sonra sipariş verilmiş olan yemeklerin hazır olduğunu gördü ve müşteriye servis etmek üzere aldı ve masanıza getirdi. Fark ettiyseniz garson siz sipariş verdikten sonra mutfakta oturup siparişinizin hazırlanmasını beklemedi. Bu sayede restorana gelen her yeni müşteri en kısa bekleme süresi yani sadece siparişinin hazırlanmasını beklemiş olacaktır. Yazılım dünyasında da aynı şekilde bir kod satırı veya kod bloğunun tamamlanması uzun sürebilir ama bu diğer satır ve blokların çalıştırılması için engel değildir. JavaScript çalışma mantığı da benzer şeklidedir.
Kısaca özetleyelim. Asenkron dediğimiz kavram şudur, uzun zaman alan veya farklı görevdeki karmaşık işlemler aynı anda gerçekleştirilir. JavaScript üzerinden bir önek verelim, SetTimeout fonksiyonu asenkron çalışan bir fonksiyondur. Belli bir süre geçtikten sonra işlemi gerçekleştirir. SetTimeout fonksiyonu harekete geçirildiği zaman bitmesine beklemeden bir sonraki fonksiyona geçer. SetTimeout fonksiyonun süresi dolduğunda ise içindeki işlemi gerçekleştirir.
Kod yazarken bu işe yeni başlayanlarda görülen yanılgılardan biri de kodların her zaman yukarıdan aşağıya doğru çalıştığını ve bu şekilde akan zaman çizelgesinde ilerlediğini düşünmek oluyor. Ama aslında kodlar her zaman yukarıdan aşağıya doğru çalışmazlar. Aynı zamanda kodlar içinde geleceğe açılan kapılar da oluyor, işte bu asenkron çalışan bir kod oluyor. JavaScript de bunu sağlayabileceğimiz özelliklerden biri de Promise.
Bu promise olayını araba ve tamirci örneği ile anlatayım. Örnek olarak bu kodu ele alırsak;
Bu şekilde bir araba objemiz olduğunu düşünelim ve bu arabanın motoru bozuk olsun. Bu arabayı tamir ettirmek için de bir promise fonksiyonu oluşturalım.
Peki neden promise oluşturuyoruz bu durumda? Çünkü işlemin ne zaman biteceğini bilmediğimiz durumlarda promise kullanıyoruz ki programımızın çalışması sırasında diğer işlemler durmasın. Yani aynı örnekten gidersek arabayı tamire verdiğimizde araba tamir edilirken başka işlerimizle meşgul olabiliriz. Burada tamirciye diyoruz ki "arabayı tamir ettiğinde bana haber vereceğine söz (promise) ver " ve tamirci bize söz veriyor. Eğer promise dönmeseydik araba tamir oluncaya dek beklememiz gerekirdi ve bu iş saatler sürebilir ve biz başka hiçbir iş yapamazdık.
Şimdi arabayı tamire verdiğimizde başka iş yapabiliyor muyuz, yoksa yapamıyor muyuz ona bakalım ve kodumuzun tamamını görelim;
bu kodu çalıştırdığımızda bu sonucu alıyoruz;
Bu sonuca bakınca akla gelen önemli sorular, neden başka işleri hallettim cümlesi kod içinde sonda iken en başta yazıldı?
Kodumuzun başında araba objemiz var ve araba tamirini 1 dakika yani setTimeout(func, 60000) yapan bir tamircimiz. Tamirciye arabayı veriyoruz ve tamirci bize söz veriyor. İşini bitirince .then içindeki bloğu çağıracağım diyor ve bu arada başka işleri yapıyoruz. Bu nedenle bu kodu çalıştırdığımızda ilk olarak ekrana başka işleri hallettim yazar. Çünkü tamirci promise sayesinde asenkron çalışıyor ve diğer işleri bloklamıyor.
Yani burada kodumuz yukarıdan aşağıya doğru değil, arada geleceğe kapılar açılıyor. Yani bu kodda setTimeout kısmı ve .then kısmı geleceğe açılan kaıplar ve o anda değil gelecekte yani araba tamir edilirken ve edildikten sonra çalışacak kod bloklarını içeriyorlar. O nedenle de bu kodda önce başka işleri hallettim mesajını ilk yazıyor sonra yaklaşık 1 dakika sonra tamir edilmiş arabayı .then blogu içine alıyoruz.
Hatta kodun en sonunda başka işleri hallettikten sonra arabanın durumuna baktığımızda bize arabanın hala bozuk olduğunu veriyor.
Yani kodun en sonunda arabayı kullanmak istediğimiz bir kod yazarsak arabayı kullanamayız çünkü kodun son satırında araba hala bozuk, araba .then bloğu içinde tamir edilmiş olacak ve bu blok zaman çizelgesinde kodun son satırından da sonra bir zamanda çalışır, çok sonra farklı bir zaman diliminde.
O nedenle asenkron programlama programcı açısından zaman kavramını da dikkate almak, o satırdan o anda gerçekleşen işleri de dikkate almak demek. Yani kodun içinde geleceğe kapılar açmak demek.
Bu kodun zaman çizelgesinde çalışma anları şu şekilde olur;