モジュールのレッスン (3/4)
フェッチ (シミュレート)
実際のページでは、fetch(url) がサーバーを呼び出します。ここの学習ブラウザではできません
外部サーバーと通信するため、テストでは「偽の」 fetch: を使用します。
globalThis.fetch は、事前定義されたデータを返す挿入されているため、練習することができます。
ネットワークに依存しないロジックを実現します。
気になる API は実際の API と同じです。
const response = await fetch('/api/utenti');
const data = await response.json();fetch(url) は、Response オブジェクトに解決される Promise を返します。 Response.json() が返されます
次に、解析された本体を持つ Promise です。したがって、2 待つ必要があります。
完全な例
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 を使用します。
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 を使用してすべての呼び出しを待ちます。
const [u, p] = await Promise.all([
fetch('/api/utenti').then((r) => r.json()),
fetch('/api/prodotti').then((r) => r.json()),
]);2 つの連続する await をシリアルに実行すると、ほぼ 2 倍の時間がかかります (合計)。並行してそれは
2 つのうちの最大値 (最も遅いもの)。
試してみてください
`loadUsers()` を非同期に定義します。 fetch('/api/utenti') を呼び出し、次に .json() を呼び出して users 配列を取得し、それを返します。
ヒントを表示
2 つの待機が行われます。1 つは取得時、もう 1 つは .json() です。
3 回の試行後に解決策が利用可能になります
復習演習
`loadInParallel(urls)` を非同期で定義します。URL の配列を受け取り、Promise.all と並行してそれぞれに対して fetch + .json() を実行し、受け取った JSON 値の配列を同じ順序で返します。
ヒントを表示
urls.map((u) => fetch(u).then(r => r.json())) および Promise.all。
3 回の試行後に解決策が利用可能になります