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

להביא (סימולציה)

בדף אמיתי, fetch(url) מתקשר לשרת. כאן בדפדפן הלימוד אנחנו לא יכולים דבר עם שרתים חיצוניים, אז נשתמש ב-"מזויף" fetch: בבדיקות, globalThis.fetch הוא מוזרם שמחזיר נתונים מוגדרים מראש, כך שתוכל להתאמן על לוגיקה ללא תלות ברשת.

ה-API שאכפת לך ממנו זהה לזה האמיתי:

JS
const response = await fetch('/api/utenti');
const data = await response.json();

fetch(url) מחזירה הבטחה שנפתרת לאובייקט Response. Response.json() חוזר בתורו הבטחה עם הגוף המנתח. אז אתה צריך שני מחכים.

דוגמה מלאה

JS
async function loadUsers() {
  const response = await fetch('/api/utenti');
  const users = await response.json();
  return users;
}

const list = await loadUsers();
// [{...}, {...}]

בודק אם זה הצליח

fetch לא זורק אם השרת מגיב עם סטטוס שגיאה (404, 500). זה עדיין נותן לך a Response, אבל עם ok: false:

JS
const r = await fetch('/api/utenti');
if (!r.ok) {
  throw new Error(`HTTP ${r.status}`);
}
const data = await r.json();

fetch זורק רק אם הרשת נכשלת (ללא חיבור, DNS, ...).

מספר בקשות במקביל: Promise.all

אם אתה צריך לבצע N שיחות עצמאיות, הפעל אותן יחד והמתן לכולן עם Promise.all:

JS
const [u, p] = await Promise.all([
  fetch('/api/utenti').then((r) => r.json()),
  fetch('/api/prodotti').then((r) => r.json()),
]);

באופן סדרתי עם שתי awaits עוקבות זה ייקח כמעט פי שניים מהזמן (סכום); במקביל זה ה מקסימום מהשניים (האיטי ביותר).

נסה את זה

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

הגדר `loadUsers()` async: קרא fetch('/api/utenti'), ואז .json() כדי להשיג את מערך המשתמשים ולהחזיר אותו.

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

שניים מחכים: אחד באחזור, אחד ב-‎.json().

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

סקירת התרגיל

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

הגדר 'loadInParallel(urls)' אסינכרון: קבל מערך של כתובות URL, בצע אחזור + .json() בכל אחת מהן במקביל ל-Promise.all, והחזר מערך של ערכי ה-JSON שהתקבלו, באותו סדר.

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

urls.map((u) => fetch(u).then(r => r.json())) ו-Promise.all.

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