跳转到主要内容
模块 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。所以你需要两个等待。

完整示例

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

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

检查是否成功

如果服务器响应错误状态(404、500),fetch 不会抛出。它仍然给你 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()),
]);

连续使用两个连续的 await 会花费几乎两倍的时间(总和);同时它是 两者中的最大值(最慢的)。

尝试一下

锻炼#js.m7.l3.e1
尝试:0加载中...

定义 `loadUsers()` 异步:调用 fetch('/api/utenti'),然后调用 .json() 获取 users 数组并返回。

正在加载编辑器...
显示提示

两种等待:一种用于 fetch,另一种用于 .json()。

3 次尝试后可用的解决方案

复习练习

锻炼#js.m7.l3.e2
尝试:0加载中...

定义异步 `loadInParallel(urls)`:接收一组 URL,与 Promise.all 并行地对每个 URL 执行 fetch + .json(),并以相同的顺序返回一组接收到的 JSON 值。

正在加载编辑器...
显示提示

urls.map((u) => fetch(u).then(r => r.json())) 和 Promise.all。

3 次尝试后可用的解决方案