Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
JavaScript’te async ve await, Promise tabanlı asenkron işlemleri daha okunabilir yazmayı sağlayan iki anahtar kelimedir. async bir fonksiyonu her zaman Promise döndüren hâle getirir; await ise bu Promise’in sonucunu bekler ve sonucu doğrudan bir değişkene atamanıza izin verir. Bekleme, JavaScript’in tamamını durdurmaz; yalnızca ilgili async fonksiyonun devamını erteler.

Nasıl çalışır?​


Bir async fonksiyon içindeki await ifadesi, Promise sonuçlanana kadar fonksiyonun sonraki satırlarını bekletir. Promise başarılı olursa sonuç elde edilir; reddedilirse hata oluşur ve bu hata try...catch ile yakalanabilir.

Bir async fonksiyon normal bir değer döndürse bile dışarıya verilen sonuç Promise olarak gelir. Sonucu await veya .then() ile alın.

Çalıştırılabilir en küçük örnek​


Aşağıdaki örnek, sunucudan veri gelmesini taklit eder. Tarayıcı konsoluna veya Node.js dosyasına doğrudan yapıştırılabilir:

JavaScript:
function veriGetir() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({ mesaj: "Veri başarıyla alındı" });
    }, 500);
  });
}

async function uygulamayiCalistir() {
  try {
    console.log("Veri bekleniyor...");

    const sonuc = await veriGetir();

    console.log(sonuc.mesaj);
    return sonuc;
  } catch (hata) {
    console.error("İşlem başarısız:", hata);
  }
}

uygulamayiCalistir();

Beklenen çıktı sırasıyla şudur:

Kod:
Veri bekleniyor...
Veri başarıyla alındı

İlk console.log hemen çalışır. veriGetir() tarafından döndürülen Promise tamamlanınca await sonucu sonuc değişkenine aktarır. Promise reddedilirse işlem catch bloğuna gider.

Hangi durumda nasıl kullanılmalı?​


Birden fazla asenkron işlemin birbirinin sonucuna ihtiyacı varsa işlemleri sırayla await edin. Örneğin önce kullanıcıyı, sonra o kullanıcıya ait siparişleri almak gerekir.

İşlemler birbirinden bağımsızsa gereksiz yere art arda await kullanmayın. Promise’leri önce başlatıp birlikte beklemek daha uygundur:

JavaScript:
async function verileriGetir() {
  const kullanicilarPromise = veriGetir();
  const ayarlarPromise = veriGetir();

  const [kullanicilar, ayarlar] = await Promise.all([
    kullanicilarPromise,
    ayarlarPromise
  ]);

  return { kullanicilar, ayarlar };
}

Karar verirken temel ayrım şöyledir:
DurumTercihNeden
İkinci işlem birincinin sonucunu kullanıyorArdışık awaitBağımlılık vardır
İşlemler birbirinden bağımsızPromise.allBirlikte başlatılabilirler
Hata özel olarak ele alınacaktry...catchBaşarısız durum kontrol edilir

Sık yapılan hatalar​

  1. await ifadesini normal bir fonksiyonda kullanmak: await genellikle async fonksiyon içinde kullanılmalıdır. Modül dosyalarında üst seviyede kullanım ayrıca mümkün olabilir.
  2. async fonksiyonun sonucunu normal değer sanmak: const sonuc = fonksiyon(); ifadesi çoğunlukla gerçek veriyi değil, Promise’i alır. Gerekirse const sonuc = await fonksiyon(); yazın.
  3. Bağımsız işlemleri gereksiz yere sıraya koymak: Her işlemden sonra beklemek toplam süreyi uzatabilir. Bağımsız işlemlerde Promise.all değerlendirin.
  4. Hata kontrolü yapmamak: Ağ isteği, dosya okuma veya veritabanı işlemi başarısız olabilir. Kritik işlemleri try...catch ile çevreleyin.
  5. forEach callback'ini async yapmak: forEach callback Promise sonuçlarını beklemez. Normal callback içinde await yazmak ise sözdizimi hatasıdır. Sıralı işlem için for...of, paralel işlem için map ve Promise.all kullanın.

Hata sözleşmesini belirleme​


Zamanlayıcı örneği gerçek ağ isteği yapmaz. Gerçek uygulamada veri alma, ayrıştırma ve iş kuralı hatalarını ayrı değerlendirin. Fetch kullanıldığında HTTP 404/500 her zaman Promise reddi üretmez; response.ok gibi durum bilgisini ayrıca kontrol edin.

Async kelimesi uzun senkron hesaplamayı başka iş parçacığına taşımaz. İlk await öncesinde veya sonrasında ağır döngü çalıştırmak ana iş parçacığını yine meşgul edebilir. Beklemek ile CPU işini arka plana taşımak ayrı konulardır.

Sık sorulan sorular​


Promise.all hata verince başlayan diğer işler iptal edilir mi?​


Hayır. Ortak Promise reddedilebilir; başlamış işler otomatik iptal edilmez. Gerçek iptal için ilgili API'nin desteklediği mekanizma gerekir. Bütün başarı/hata sonuçlarını toplamak için Promise.allSettled ayrıca değerlendirilebilir.

Promise olmayan değerde await senkron atama gibi mi davranır?​


Hayır. Değer alınabilir fakat await sonrasındaki devam yine asenkron zamanlanır. Aynı çağrı yığını içinde sıradan değişken atamasıyla aynı akışı varsaymayın.

Catch içinde yalnız hata yazdırırsam çağıran kod hatayı anlar mı?​


Şart değildir. Örnekte catch yeniden throw etmezse fonksiyon undefined ile başarılı tamamlanabilir. Çağıranın başarısızlığı işlemesi gerekiyorsa yeniden fırlatın veya açık bir sonuç nesnesi döndürün; sözleşmeyi tutarlı belirleyin.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic