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.
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:
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
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:
const outcomes = await Promise.allSettled(ps);
// [{ status: 'fulfilled', value: 1 },
// { status: 'rejected', reason: Error('no') },
// { status: 'fulfilled', value: 3 }]Deneyin
'readOrFallback(p, fallback)' async'i tanımlayın: Promise p'yi beklemeye çalışın; reddedilirse geri dönüş yapın.
İpucu göster
try { return bekliyor p; } catch { geri dönüş; }
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
'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.
İpucu göster
try { return wait Promise.all(sözler); } catch { return []; }
3 denemeden sonra çözüm mevcut