Konularımıza başlamadan önce asenkron ve senkron programlama arasındaki farkı küçük bir özet şeklinde açıklamak istiyorum.
Senkron programlamada bir fonksiyon bitmeden diğeri çalışmaya başlamaz yani birbirlerini beklerler bekleyen fonksiyonun cevabı dönmeden diğerine geçilmez. Fakat asenkron fonksiyonlar aynı anda çalışmaya başlarlar ve birbirlerinin sonucunu beklemeden çalışmaya devam ederler. Hangisinin sonucu önce çıkarsa o sonuç gösterilir. Javascript’in çalışma mantığı single-thread şeklindedir ve asenkron çalışır. Yani bir satırı okuyup çıktısını bekleyip diğer satıra geçmez. Her bir satırı okur ve belirli bir sıraya yerleştirir. Bu çalışma mantığı çok detaylı bir konu olduğu için sonraki yazılarımda değineceğim.
Callback, bir fonkisyonu başka bir fonkisyona parametre olarak verip kullanmaya denir. Bu şekilde kullanılarak senkron bir şekilde çalışmasını sağlayabiliriz.
Bir örnekle açıklamaya çalışalım.
Yukarıdaki örnekte gördüğünüz üzere "printAll” fonksiyonu çağırıldığında her zaman farklı bir sırada çıktı göreceğiz. Hiçbir çıktı birbirini beklemeyecek ve süresi az olan hangisi olursa o ilk çıkacaktır. Callback kullanarak bunu istediğimiz sırayla çıkmasını istersek eğer şu şekilde yapabiliriz.
Callback kullanmaktaki amacımız aslında önce hangi fonksiyonun çalışacağını ve sonuç göstereceğini belirlemektir.
Fakat callback kullanımında birkaç problem vardır. Bunlara örnek olarak;
Yukarda yaptığımız örnekte de görebileceğiniz üzere daha fazla sıralayacak değerimiz olsaydı çok daha fazla iç içe callback yazmak gerekecekti.
Callback fonksiyonlardaki problemlerden dolayı Promise kavramı oluşturulmuştur.
Promise aslında Türkçe çevirisinden de anlayabileceğimiz üzerine sözdür. Mesela internetten bir sipariş veriyorsunuz. Size bir sipariş sözü verildiğini biliyorsunuz yani elinize bir mesaj veya bir mal geçecek buna “promise”, buradan gelen bildirimi beklemeye “pending”, cevap başarılı yani sipariş size ulaşacak ise “resolved”, siparişiniz iptal olduysa “rejected” oluyor. Bu başarısız durumda da hata çözümleme(error-handling) yapılarak başka bir çözüm yoluna gidiliyor.
Yukarıda yaptığımız callback örneğini bu kez promise ile yapalım.
Burada oluşturduğumuz “printorder” fonksiyonu bize bir promise oluşturacak ve döndürecek. Oluşturduğumuz promise if bloğu eğer true ise resolve olacak ve then içinde çözülerek gönderdiğimiz order parametresini dönecek. Eğer false olur ise reject olacak ve catch bloğunda yakalanarak konsolda gösterilecek.
Fakat callback fonksiyonlarda oluşan callback hell olayı burada da oluşmaya başladı. Bunun çözümü için async-await fonksiyonlar kullanılmaya başlandı. Aslında bu fonksiyonlar geliştirici ve kodu okuyan insanlar için kodun asenkron olmasına rağmen senkron gözükmesini de sağlar.
Bu fonksiyonların amacı senkron olan yani çağırıldığı şekilde ve birbirlerini beklemeyen fonksiyonları, asenkron hale çevirmemize yarar. Bir fonksiyon başarılı olduğunda başka bir fonksiyon çalıştırmak istersek ve o sırada bu işlemi bekletmek istersek bu yapıyı kullanırız. Promise kullanım mantığının aynısıdır sadece daha anlaşılır bir yapıdır.
Async-await fonksiyon için bir örnek oluşturalım.
Yukarıdaki örnekte bir “deviceList” fonksiyonumuz var. Bunu bir servise istek atıyormuşuz gibi düşünelim. Bir promise’imiz var ve bu promise’in içinde bir if bloğumuz var. Eğer bu “true” olur ise datalarımız 5 saniye içinde yüklenecek ve resolve edilecek, eğer tersi olur ise data alımında bir sorun olacak ve reject edilecek.
Bu fonksiyonumuz alt kısmında tanımladığımız “getDevices” fonksiyonumuz bir “async” fonksiyon. Try-catch bloğumuz ile await ettiğimiz fonksiyondan dönen cevap başarılı ise fonksiyonumuz konsola datamızı basacak. Başarısız ise catch in içine düşerek “Datalar Alınamadı!!” hatasını göreceğiz. Await ettiğimiz kısımda datalar gelene kadar yani 5 saniye geçene kadar konsolda bir şey göremeyeceğiz. Ancak o işlem bir sonuca vardığında diğer satıra geçecek ve önce bize datamızı ardından da “Datalar Alındı!!” mesajını gösterecek.
Tek bir istekte nasıl bir yazım olduğunu gördük. Birde birkaç tane istek attığımız ve birden fazla await yazdığımızı düşünelim.
Yukarda 3 adet sahte istek fonksiyonu yazdık ve içlerinde birer promise var. Bunların her birini async fonksiyonumuzun içinde çağırdık ve await verdik. Try -catch bloğumuz her birinin cevabını kontrol edecek ve bir tanesi bile reject olur ise onu catch e düşürüp reject’ten gelen mesajı basacak. Buradaki örnekte çıktımız “reject2!” olacak.
Fakat eğer promiselerin her biri resolve olsaydı ve try bloğunun içinde her bir sonucu konsola yazdırsaydık her bir istek sırası ile çalışacak ve yazdırdığımız sıraya göre çıktı alacaktık. Birde öyle bir örnek yapalım.
Burada konsolda göreceğimiz sonuç resolve2, resolve1, resolve3 olur ama bu çıktıları görmek için 6 saniye bekleyecektik. Yani bütün await olan fonksiyonların çözülmesini ve bize başarılı dönmelerini.
Özetlemek gerekirse sizlere callback, promise ve async-await fonksiyonların tanımını ve nasıl çalıştıklarını anlatmaya çalıştım. Hepsi aslında asenkron çalışan Javascript’i senkron bir hale getirmek için kullanılan yapılardır. Özellikle async-await yapısı kesinlikle kullanılması gereken, kodunuzu daha okunabilir hale getiren ve asenkron fonksiyonları çok basit bir şekilde senkron hale dönüştüren bir yoldur.
Software Developer
NodeJS Projesine Swagger Entegrasyonu
Dökümantasyon Nedir? Dökümantasyonun ÖnemiBir uygulama yazarken, takımlararası iletişimi sağlamak, uygulamanın ne olduğunu ve hangi api...
CAP Projelerinde Javascript mi yoksa Typescript mi Tercih Edilmeli?
JavaScript mi TypeScript mi sorusu CAP projelerinde bir ayrım noktasıdır; çoğu geliştirici bunu düşünmeden JavaScript ile başlar, sonra...
NodeJS ile API Testi Nasıl Yapılır?
API Testi Nedir, Ne İşe Yarar?API testi, bir uygulama programlama arayüzünün (API) beklenen işlevselliğini, güvenliği, performansı ve...
İleti Yönetim Sistemi (İYS) Nedir? İYS Entegrasyon Rehberi
TC. Ticaret Bakanlığı’nın, Ticari İletişim ve Ticari Elektronik İletiler Hakkında yayınladığı yönetmelikte, hizmet sağlayıcı...
SAP S/4HANA ve Salesforce Arasında Bulut Tabanlı Entegrasyon Mimarisi
Salesforce, müşteri ilişkileri yönetimi (CRM) alanında hizmet sunan, bulut mimarisi üzerine kurulmuş bir platformdur. Bu platform; müşteri...
Almanya’da Zorunlu e-Fatura Hakkında Bilmeniz Gerekenler
Almanya, ilk olarak 2020 yılında İşletmeden Hükümete (B2G) işlemleri için elektronik fatura zorunluluğunu getirdi. Mevzuata uyum sağlamak...
SAP TM ile Lojistik Maliyetlerini Nasıl Optimize Edebilirsiniz?
Giriş Nakliye süreçlerinde maliyet hesaplamaları ve faturalandırma, lojistik operasyonlarının en önemli aşamalarından biridir. Manuel...
SAP Business Technology Platform Nedir? SAP BTP Rehberi
SAP Business Technology Platform nedir? SAP BTP; veri ve analitik, yapay zeka, uygulama geliştirme, entegrasyon ve otomasyon yeteneklerini tek bir...
SAP e-Fatura ve Yasal Uyum: GİB Entegrasyonunda Şirketlerin Yaptığı Hatalar
SAP GİB e-fatura entegrasyonunda yapılan 6 kritik hata ve önleme yolları. Yasal uyum risklerini sıfırlamak için uzman...
Mailiniz başarıyla gönderilmiştir en kısa sürede sizinle iletişime geçilecektir.
Mesajınız ulaştırılamadı! Lütfen daha sonra tekrar deneyin.