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

Lỗi trong mã không đồng bộ

Hoạt động không đồng bộ thất bại khác với hoạt động đồng bộ: lỗi không xuất hiện ngay lập tức, nó đến "sau", khi Promise chuyển sang trạng thái bị từ chối. Hãy nhìn vào hai công cụ chính.

try/catch với await

Khi bạn đặt await trước một Promise không thành công, lỗi sẽ được ghi lại dưới dạng ngoại lệ thông thường: bạn bắt nó bằng try/catch.

JS
async function safeRead() {
  try {
    const r = await fetch('/api/cose');
    if (!r.ok) throw new Error('HTTP ' + r.status);
    return await r.json();
  } catch (err) {
    console.error('network error:', err.message);
    return null;
  }
}

Đây là mẫu dễ đọc nhất: bạn viết "con đường hạnh phúc" một cách tuyến tính và xử lý mọi thứ trong một khối duy nhất.

.catch theo lời hứa

Theo kiểu xích:

JS
fetch('/api/cose')
  .then((r) => r.json())
  .then((data) => console.log(data))
  .catch((err) => console.error(err));

.catch phát hiện bất kỳ lỗi nào xảy ra dọc theo chuỗi trước đó.

Promise.all thất bại trong lần từ chối đầu tiên

JS
const ps = [Promise.resolve(1), Promise.reject(new Error('no')), Promise.resolve(3)];
try {
  const r = await Promise.all(ps);
} catch (err) {
  console.log(err.message); // 'no'
}

Các Lời hứa khác tiếp tục chạy ở chế độ nền nhưng Promise.all "giải quyết" được lỗi đầu tiên. Nếu bạn muốn kết quả của tất cả chúng (bao gồm cả lỗi), hãy sử dụng Promise.allSettled:

JS
const outcomes = await Promise.allSettled(ps);
// [{ status: 'fulfilled', value: 1 },
//  { status: 'rejected', reason: Error('no') },
//  { status: 'fulfilled', value: 3 }]

Hãy thử nó

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

Xác định async `readOrFallback(p, fallback)`: thử chờ Promise p; nếu nó bị từ chối, hãy trả về dự phòng.

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

thử { quay lại đang chờ p; } bắt { trả về dự phòng; }

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.l4.e2
Nỗ lực: 0Đang tải…

Xác định async `allOrNothing(promises)`: sử dụng Promise.all. Nếu ít nhất một lỗi, trả về mảng trống []. Nếu không thì trả về các giá trị.

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

thử { return đang chờ Promise.all(lời hứa); } bắt { trả lại []; }

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