Chuyển đến nội dung chính
Mô-đun 7 · Bài học 3 trong tổng số 427/32 trong khóa học~14 min
Bài học theo mô-đun (3/4)

lấy (mô phỏng)

Trên trang thực, fetch(url) gọi máy chủ. Ở đây trong trình duyệt học tập, chúng tôi không thể nói chuyện với các máy chủ bên ngoài, vì vậy chúng tôi sẽ sử dụng fetch "giả": trong các thử nghiệm, một globalThis.fetch được chèn trả về dữ liệu được xác định trước, do đó bạn có thể thực hành trên logic mà không phụ thuộc vào mạng.

API bạn quan tâm giống với API thật:

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

fetch(url) trả về Lời hứa phân giải thành đối tượng Response. Response.json() trả lại lần lượt một Promise với nội dung được phân tích cú pháp. Vì vậy, bạn cần hai chờ đợi.

Ví dụ hoàn chỉnh

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

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

Kiểm tra xem nó có thành công không

fetch không ném nếu máy chủ phản hồi với trạng thái lỗi (404, 500). Nó vẫn mang lại cho bạn một Response, nhưng với ok: false:

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

fetch chỉ ném nếu mạng bị lỗi (không có kết nối, DNS, ...).

Nhiều yêu cầu song song: Promise.all

Nếu bạn cần thực hiện N cuộc gọi độc lập, hãy khởi chạy chúng cùng nhau và đợi tất cả chúng bằng Promise.all:

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

Thực tế với hai await liên tiếp sẽ mất gần gấp đôi thời gian (tổng); song song đó là tối đa của cả hai (chậm nhất).

Hãy thử nó

tập thể dục#js.m7.l3.e1
Nỗ lực: 0Đang tải…

Xác định `loadUsers()` async: gọi hàm tìm nạp('/api/utenti'), sau đó gọi .json() để lấy mảng người dùng và trả về nó.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Hai cái đang chờ: một cái đang tìm nạp, một cái đang chờ .json().

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#js.m7.l3.e2
Nỗ lực: 0Đang tải…

Xác định `loadInParallel(urls)` async: nhận một mảng URL, tìm nạp + .json() trên mỗi URL song song với Promise.all và trả về một mảng các giá trị JSON đã nhận, theo cùng một thứ tự.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

urls.map((u) => get(u).then(r => r.json())) và Promise.all.

Giải pháp khả dụng sau 3 lần thử