Yıldız Teknik Üniversitesi Mezunu
Matematik Mühendisi
Yazılımcı
California - Kütahya - İstanbul - Maryland güzargahında 29 yıllık göçebe bir yaşam
Kız labrador babası
Kitapsever keyif insanı
Resim bir bilimdir ve tüm bilimler matematiğe dayanır. İnsanın ortaya koyduğu hiçbir şey; matematikte yerini bulmaksızın bilim olamaz.
EcmaScript 6 ile iyiden iyiye hayatımıza girmiş olan Promise yapıları , asenkron çalışan JavaScriptte fonksiyonlarımızı veya işlemlerimizi bir düzene koymada veya sistemde bir değeri veya işlemi bekleyebilmemizi sağlamada büyük iş görüyor. Hatta sonu gelmeyen Callback fonksiyonlardan yorulmuş yazılımcılarda ilaç etkisi bile yaratmış olabilir.
Bildiğiniz üzere biz JavaScriptte fonksiyonlarımızı bir sırayla çalıştırmak istediğimizde callback fonksiyonlardan yararlanıyorduk. Basitçe bir parametre olarak gönderdiğimiz fonksiyonu çalışmasını istediğimiz zaman çağırıyorduk. Promise yapısında ise kod bloğumuzda new ön eki ile bir söz verdiğimizi söylüyor ve sistemi beklemeye alıyoruz. Daha sonra içerisinde iki parametreden alan bir fonksiyon tanımlıyoruz. Bu parametrelerden ilkini işlerimiz yolunda gitmesi halinde değer döndürmek için kullanıyoruz. Aksi halde ikinci parametre ile hata değeri döndürebiliyoruz. Aşağıda parametre isimleri resolve ve reject olarak belirlenmiş durumda. Esasında bu isimlendirmenin bir önemi yok istediğimiz gibi yapabilirdik.
const sozumuz = new Promise((resolve,reject)=>{ let islem = true; if (islem) resolve("Hersey umdugumuz gibi gitti.."); else reject("Bir sorunla karsilastik ve islem tamamlanmadi."); }); sozumuz.then((data)=>{ console.log(data); });
Yukarıda ki örnekte işlemlerimizin umduğumuz gibi gittiğini varsaydık ve geriye resolve ile bir değer gönderdik. Burada önemli nokta resolve ile gönderilen değerler then ile yakalanır iken reject için catch kullanmamız gerekiyor. Yani yukarıdaki örnekte işlem değişkenine false değeri verilirse hata ile karşılacağız. Olması gereken :
JavaScript asenkron çalışan bir programlama dili olduğu için bir fonksiyonun işlemini tamamlaması beklenmeden bir sonraki fonksiyona geçiş yapılır. Bu durum bir çok programlama dilinde karşımıza çıkmadığı için JavaScript ile yeni ilgilenenler için baş ağrısı yaratabilir. Ancak Callback Fonksiyonları öğrendikten sonra işimizin o kadar da zor olmadığını anlayacağız.
Javascriptin çalışma mantığını anlamak için basit bir senaryo düşünelim, bir restorantta arka arkaya iki müşteri sipariş verecek bunlardan ilki bir iskender , ikincisi ise bir bardak su istiyor. İskenderin servis edilmesi tabiki bir bardak sudan daha uzun sürecek ve ikinci müşteri suyunu aldığında ilk müşteri hala bekliyor olacak. Burada ilk müşterinin siparişi, ikinci müşterinin siparişine engel olmamakta yani restorant asenkron olarak servis vermekte diyebiliriz.
Eğer yukarıdaki örnek çok birşey ifade etmediyse gelin birde senkron çalışan bir kod yapısından bahsedelim. Mesela Php ile MySQL bağlantısı gerçekleştirdiğinizde bu işlem biraz zaman alabilir ancak sunucunuz bağlantınız gerçekleşene kadar bekleyecek ve diğer komutlarınızı çalıştırmayacak. Eğer bağlantı yapılırken diğer komutlarınız çalıştırılsaydı database bağlantınızı kullanarak yazdığınız methodlarda hata alacaktınız. Yani senkron yapıda bir fonksiyon kendinden sonra gelen fonksiyonları bloklarken , asenkron yapıda bloklama yapılmaz.
Hadi biraz kod yazarak detaylandıralım. İlk olarak 2 farklı fonksiyon tanımlayalım ve bunları sırasıyla çağıralım.
function adimiYaz(ad){ console.log("Adiniz : " + ad); } function soyadimiYaz(soyad) { console.log("Soyadiniz : " + soyad); } adimiYaz("Kadir"); soyadimiYaz("Kasim");
Burada standart biçimde iki fonksiyon oluşturduk ve çalıştırdık.
Adiniz : Kadir Soyadiniz : Kasim
Yukarıdaki gibi bir çıktı almamız son derece normal çünkü iki fonksiyonda hızlı bir biçimde işlemini tamamladı.
Şimdi farzedelimki adimiYaz işlemini iki saniyede tamamlıyabiliyorken soyadimiYaz işlemini bir saniyede tamamlıyor. Örnek olması için ben bu tamamlanma sürelerini setTimeout fonksiyonunu kullanarak düzenleyeceğim. setTimeout fonksiyonu genelde çalıştırılacak fonksiyona bir gecikme süresi koymak için kullanılır.