Ana içeriğe geç
Modül 7 · Ders 4 ders 4Kurstaki 28/32~12 min
Modül dersleri (4/4)

Eşzamansız koddaki hatalar

Asenkron işlemler senkronize olanlardan farklı şekilde başarısız olur: hata hemen gelmez, Söz reddedildi durumuna girdiğinde "daha sonra" gelir. İki ana araca bakalım.

try/catch ile await

Başarısız olan bir Sözün önüne await koyduğunuzda, hata bir hata olarak yeniden atılır normal istisna: try/catch ile yakalarsınız.

JS
async function safeRead() {
  try {
    const r = await fetch('/api/cose');
    if (!r.ok) throw new Error('HTTP ' + r.status);
    return await r.json();
  } catch (err) {
    console.error('network error:', err.message);
    return null;
  }
}

Bu en okunabilir kalıptır: "mutlu yolu" doğrusal olarak yazarsınız ve her şeyi tek bir blokta halledersiniz.

.catch Bir Söz Üzerine

Zincirleme tarzda:

JS
fetch('/api/cose')
  .then((r) => r.json())
  .then((data) => console.log(data))
  .catch((err) => console.error(err));

.catch önceki zincir boyunca atılan herhangi bir hatayı yakalar.

Promise.all ilk reddetmede başarısız oluyor

JS
const ps = [Promise.resolve(1), Promise.reject(new Error('no')), Promise.resolve(3)];
try {
  const r = await Promise.all(ps);
} catch (err) {
  console.log(err.message); // 'no'
}

Diğer Promises arka planda çalışmaya devam ediyor, ancak Promise.all ilk hatayı "yerleştiriyor". Hepsinin (başarısızlıklar dahil) sonuçlarını istiyorsanız Promise.allSettled kullanın:

JS
const outcomes = await Promise.allSettled(ps);
// [{ status: 'fulfilled', value: 1 },
//  { status: 'rejected', reason: Error('no') },
//  { status: 'fulfilled', value: 3 }]

Deneyin

Egzersiz#js.m7.l4.e1
Denemeler: 0Yükleniyor…

'readOrFallback(p, fallback)' async'i tanımlayın: Promise p'yi beklemeye çalışın; reddedilirse geri dönüş yapın.

Düzenleyici yükleniyor…
İpucu göster

try { return bekliyor p; } catch { geri dönüş; }

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#js.m7.l4.e2
Denemeler: 0Yükleniyor…

'allOrNothing(promises)' eşzamansız tanımlayın: Promise.all'ı kullanın. En az biri başarısız olursa boş diziyi [] döndürün. Aksi halde değerleri döndürün.

Düzenleyici yükleniyor…
İpucu göster

try { return wait Promise.all(sözler); } catch { return []; }

3 denemeden sonra çözüm mevcut