דילוג לתוכן המרכזי
מודול 7 · שיעור 4 מתוך 428/32 בקורס~12 min
שיעורי מודול (4/4)

שגיאות בקוד אסינכרוני

פעולות אסינכרוניות נכשלות באופן שונה מאלה סינכרוניות: השגיאה לא מגיעה מיד, היא מגיעה "מאוחר יותר", כאשר ההבטחה נכנסת למצב נדחה. בואו נסתכל על שני הכלים העיקריים.

try/catch עם await

כאשר אתה שם את await לפני הבטחה שנכשלת, השגיאה מושלך מחדש בתור חריג רגיל: אתה תופס את זה עם try/catch.

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;
  }
}

זה הדפוס הכי קריא: אתה כותב את "הנתיב המאושר" באופן ליניארי, ומטפל בהכל בבלוק אחד.

.catch בהבטחה

בסגנון משורשר:

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

.catch תופס כל שגיאה שנזרקה לאורך השרשרת הקודמת.

Promise.all נכשל בדחייה הראשונה

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'
}

ההבטחות האחרות ממשיכות לרוץ ברקע, אבל Promise.all "מסתפק" על השגיאה הראשונה. אם אתה רוצה את התוצאות של כולם (כולל כשלים), השתמש ב-Promise.allSettled:

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

נסה את זה

פעילות גופנית#js.m7.l4.e1
ניסיונות: 0טוען...

הגדר `readOrFallback(p, fallback)` אסינכרון: נסה להמתין להבטחה p; אם היא נדחתה, החזר חזרה.

טוען עורך...
הצג רמז

try { return await p; } catch { return fallback; }

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#js.m7.l4.e2
ניסיונות: 0טוען...

הגדר 'allOrNothing(promises)' אסינכרון: השתמש ב-Promise.all. אם לפחות אחד נכשל, החזר את המערך הריק []. אחרת החזר את הערכים.

טוען עורך...
הצג רמז

try { return await Promise.all(promises); } catch { return []; }

הפתרון זמין לאחר 3 ניסיונות