Bu ders için video bulunmamaktadır.
Ders İçeriği
Giriş: Eşzamansız Kodun Evrimi
Önceki derslerde, JavaScript'te eşzamansız programlamanın temellerini, callback fonksiyonlarını ve Promise'ları öğrendik. Promise'lar, callback cehennemini önleyerek eşzamansız kodu daha okunabilir ve yönetilebilir hale getirdi. Ancak, karmaşık eşzamansız işlemler söz konusu olduğunda, Promise zincirleri bile uzun ve karmaşık olabilir.
ES2017 (ES8) ile tanıtılan async/await sözdizimi, Promise'lar üzerine inşa edilmiş ve eşzamansız kodu daha da okunabilir ve yazması kolay hale getiren bir soyutlama katmanıdır. Async/await, eşzamansız kodu neredeyse senkron kod gibi yazmanıza olanak tanır, bu da özellikle karmaşık eşzamansız işlemler için büyük bir avantajdır.
Bu derste, async/await'in ne olduğunu, nasıl çalıştığını, Promise'larla ilişkisini ve eşzamansız kodumuzu nasıl daha da iyileştirdiğini öğreneceğiz.
Async/Await Nedir?
Async/await, Promise'ları daha okunabilir ve yazması kolay bir şekilde kullanmamızı sağlayan bir JavaScript sözdizimi özelliğidir. İki ana bileşenden oluşur:
async
anahtar kelimesi: Bir fonksiyonun önüne eklenir ve o fonksiyonun her zaman bir Promise döndüreceğini belirtir. Fonksiyon bir değer döndürürse, JavaScript bu değeri otomatik olarak bir Promise içine sarar (Promise.resolve ile).await
anahtar kelimesi: Sadeceasync
fonksiyonlar içinde kullanılabilir ve bir Promise'ın çözülmesini (resolve edilmesini) bekler.await
ifadesi, Promise çözülene kadar fonksiyonun yürütülmesini "duraklatır" (aslında bloklamadan bekletir) ve çözüldüğünde, Promise'ın sonucunu döndürür.
Async/await, Promise'ların üzerine inşa edilmiştir ve aslında Promise'ları kullanmanın daha zarif bir yoludur. Arka planda, JavaScript motoru hala Promise'ları kullanır, ancak kod yazma ve okuma deneyimi çok daha senkron kod benzeri olur.
Async Fonksiyonlar
Bir fonksiyonu async
olarak tanımlamak için, fonksiyon tanımının önüne async
anahtar kelimesini eklemeniz yeterlidir. Bu, fonksiyonun her zaman bir Promise döndüreceği anlamına gelir.
Gördüğünüz gibi, async
fonksiyon bir değer döndürdüğünde, JavaScript bu değeri otomatik olarak bir Promise içine sarar. Eğer fonksiyon bir hata fırlatırsa, döndürülen Promise otomatik olarak reject edilir.
Await Operatörü
await
operatörü, bir Promise'ın çözülmesini (resolve edilmesini) beklemek için kullanılır ve sadece async
fonksiyonlar içinde kullanılabilir. await
ifadesi, Promise çözülene kadar fonksiyonun yürütülmesini "duraklatır" ve çözüldüğünde, Promise'ın sonucunu döndürür.
Bu örnekte, islemYap
fonksiyonu içinde await
kullanarak, Promise'ların çözülmesini sırayla bekliyoruz. Kod, sanki senkron çalışıyormuş gibi görünüyor, ancak aslında eşzamansız olarak çalışıyor ve ana iş parçacığını bloklamıyor.
Not: await
ifadesi, Promise çözülene kadar sadece async
fonksiyonun içindeki yürütmeyi duraklatır. Ana program veya diğer fonksiyonlar çalışmaya devam eder. Bu, yukarıdaki örnekte "Ana program devam ediyor..." mesajının, islemYap
fonksiyonu içindeki beklemelerden etkilenmeden hemen yazdırılmasından anlaşılabilir.
Promise Zincirleme vs. Async/Await
Aynı eşzamansız işlemi hem Promise zincirleme hem de async/await kullanarak nasıl yazabileceğimizi karşılaştıralım:
İki yaklaşımı karşılaştırdığımızda, async/await'in daha temiz, daha okunabilir ve daha az iç içe geçmiş bir kod yapısı sunduğunu görebiliriz. Özellikle, try/catch bloğu kullanarak hata yönetimi daha doğal ve senkron kod benzeri hale gelir.
Hata Yönetimi
Async/await ile hata yönetimi, normal JavaScript'teki try/catch bloklarını kullanarak yapılır. Bu, Promise'lardaki .catch()
metoduna göre daha doğal ve anlaşılır bir hata yönetimi sağlar.
Bu örnekte, veriGetir
fonksiyonu içinde try/catch bloğu kullanarak eşzamansız işlem sırasında oluşabilecek hataları yakalıyoruz. Ayrıca, anaFonksiyon
içinde de try/catch blokları kullanarak, veriGetir
fonksiyonundan fırlatılan hataları yakalıyoruz.
Async/await ile hata yönetimi, Promise'lardaki .catch()
metoduna göre daha doğal ve anlaşılır bir yapı sunar, çünkü normal JavaScript'teki try/catch bloklarını kullanır.
Paralel İşlemler
Async/await, varsayılan olarak eşzamansız işlemleri sırayla (sequential) çalıştırır. Ancak bazen, birbirinden bağımsız birden fazla eşzamansız işlemi paralel olarak çalıştırmak daha verimli olabilir.
Paralel işlemler için Promise.all()
, Promise.race()
, Promise.allSettled()
ve Promise.any()
gibi Promise metodlarını async/await ile birlikte kullanabiliriz.
Promise.all()
ile Paralel İşlemler
Promise.all()
, bir dizi Promise'ı paralel olarak çalıştırır ve tüm Promise'lar başarılı olduğunda çözülen (veya herhangi biri başarısız olduğunda reddedilen) yeni bir Promise döndürür.
Bu örnekte, üç farklı API isteğini paralel olarak başlatıyoruz ve Promise.all()
ile tüm yanıtların gelmesini bekliyoruz. Bu, işlemleri sırayla çalıştırmaktan çok daha hızlıdır.
Diğer Promise Kombinasyon Metodları
Promise.race()
: Verilen Promise'lardan herhangi biri çözüldüğünde (veya reddedildiğinde) çözülen yeni bir Promise döndürür. İlk tamamlanan işlemin sonucunu alır.Promise.allSettled()
: Tüm Promise'lar tamamlandığında (başarılı veya başarısız) çözülen yeni bir Promise döndürür. Her Promise'ın durumunu ve sonucunu içeren bir dizi döndürür.Promise.any()
: Verilen Promise'lardan herhangi biri başarıyla çözüldüğünde çözülen yeni bir Promise döndürür. Tüm Promise'lar reddedilirse, AggregateError ile reddedilir.
Alıştırmalar
- Bir sayı alan ve bu sayının karesini 1 saniye sonra döndüren bir async fonksiyon yazın. Fonksiyonu çağırın ve sonucu konsola yazdırın.
- Bir dizi ID alan ve her ID için
https://jsonplaceholder.typicode.com/posts/{id}
adresinden veri çeken bir async fonksiyon yazın. Tüm verileri bir dizide toplayıp döndürün. - İki farklı API'den veri çeken iki ayrı async fonksiyon yazın. Sonra, bu iki fonksiyonu paralel olarak çalıştıran ve her iki sonucu da birleştiren bir üçüncü async fonksiyon yazın.
- Bir async fonksiyon içinde, belirli bir olasılıkla hata fırlatan bir Promise oluşturun. Try/catch bloğu kullanarak hatayı yakalayın ve uygun bir mesaj gösterin.
- Üç farklı API'den veri çeken üç ayrı async fonksiyon yazın.
Promise.race()
kullanarak, en hızlı yanıt veren API'nin sonucunu döndüren bir fonksiyon yazın.
Bu derste, eşzamansız JavaScript kodunu daha okunabilir ve yönetilebilir hale getiren async/await sözdizimini öğrendik:
- Async/Await: Promise'lar üzerine inşa edilmiş, eşzamansız kodu senkron kod gibi yazmamızı sağlayan bir JavaScript sözdizimi özelliğidir.
- Async Fonksiyonlar:
async
anahtar kelimesi ile tanımlanır ve her zaman bir Promise döndürür. Fonksiyon bir değer döndürürse, bu değer otomatik olarak bir Promise içine sarılır. - Await Operatörü:
await
anahtar kelimesi, bir Promise'ın çözülmesini beklemek için kullanılır ve sadece async fonksiyonlar içinde kullanılabilir. Promise çözülene kadar fonksiyonun yürütülmesini "duraklatır" ve çözüldüğünde, Promise'ın sonucunu döndürür. - Hata Yönetimi: Async/await ile hata yönetimi, normal JavaScript'teki try/catch bloklarını kullanarak yapılır, bu da Promise'lardaki
.catch()
metoduna göre daha doğal ve anlaşılır bir hata yönetimi sağlar. - Paralel İşlemler:
Promise.all()
,Promise.race()
,Promise.allSettled()
vePromise.any()
gibi Promise metodlarını async/await ile birlikte kullanarak, birden fazla eşzamansız işlemi paralel olarak çalıştırabiliriz.
Async/await, modern JavaScript'te eşzamansız programlamanın en yaygın ve önerilen yöntemidir. Promise'lar üzerine inşa edilmiş olsa da, çok daha okunabilir, anlaşılır ve hata yönetimi daha kolay bir kod yapısı sunar.
Bir sonraki derste, modern web uygulamalarında veri alışverişi için kullanılan Fetch API ve AJAX konularını inceleyeceğiz.