メインコンテンツにスキップ
モジュール 7 · レッスン 3 / 4コース内の 27/32~14 min
モジュールのレッスン (3/4)

フェッチ (シミュレート)

実際のページでは、fetch(url) がサーバーを呼び出します。ここの学習ブラウザではできません 外部サーバーと通信するため、テストでは「偽の」 fetch: を使用します。 globalThis.fetch は、事前定義されたデータを返す挿入されているため、練習することができます。 ネットワークに依存しないロジックを実現します。

気になる API は実際の API と同じです。

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

fetch(url) は、Response オブジェクトに解決される Promise を返します。 Response.json() が返されます 次に、解析された本体を持つ Promise です。したがって、2 待つ必要があります。

完全な例

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

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

成功したかどうかの確認

fetch サーバーがエラー ステータス (404、500) で応答した場合、スローしません。それはまだあなたに与えます 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()),
]);

2 つの連続する await をシリアルに実行すると、ほぼ 2 倍の時間がかかります (合計)。並行してそれは 2 つのうちの最大値 (最も遅いもの)。

試してみてください

運動#js.m7.l3.e1
試行回数: 0読み込み中…

`loadUsers()` を非同期に定義します。 fetch('/api/utenti') を呼び出し、次に .json() を呼び出して users 配列を取得し、それを返します。

エディターを読み込み中…
ヒントを表示

2 つの待機が行われます。1 つは取得時、もう 1 つは .json() です。

3 回の試行後に解決策が利用可能になります

復習演習

運動#js.m7.l3.e2
試行回数: 0読み込み中…

`loadInParallel(urls)` を非同期で定義します。URL の配列を受け取り、Promise.all と並行してそれぞれに対して fetch + .json() を実行し、受け取った JSON 値の配列を同じ順序で返します。

エディターを読み込み中…
ヒントを表示

urls.map((u) => fetch(u).then(r => r.json())) および Promise.all。

3 回の試行後に解決策が利用可能になります