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

Lời hứa: chúng là gì

Promise là giá trị đại diện cho kết quả của một thao tác sẽ kết thúc trong tương lai. Nó có thể ở một trong ba trạng thái:

  • đang chờ xử lý — hoạt động vẫn đang được tiến hành
  • hoàn thành — nó đã hoàn thành thành công, có một giá trị
  • bị từ chối — thất bại, có lỗi

Một khi nó rời khỏi trạng thái chờ xử lý, nó sẽ được "giải quyết" mãi mãi.

Tạo một lời hứa đã được giải quyết

Hai cách phổ biến nhất - bạn hầu như sẽ không bao giờ tạo Promise "bằng tay" với hàm tạo:

JS
const p1 = Promise.resolve(42);
const p2 = Promise.reject(new Error('oops'));

Đọc kết quả: .then / .catch

JS
Promise.resolve(10).then((v) => {
  console.log(v); // 10
});

Promise.reject(new Error('no')).catch((e) => {
  console.log(e.message); // 'no'
});

.then nhận một hàm được gọi với giá trị đã giải quyết. .catch nhận được hàm được gọi có lỗi trong trường hợp bị từ chối.

Xâu chuỗi

Mỗi .then lần lượt trả về một Lời hứa: bạn có thể xâu chuỗi chúng để biến đổi giá trị từng bước.

JS
Promise.resolve(5)
  .then((n) => n * 2)
  .then((n) => n + 1)
  .then((n) => console.log(n)); // 11

Nếu bất kỳ .then nào ném ra (hoặc trả về một Lời hứa không thành công), thì hãy thực thi nhảy tới .catch tiếp theo đầu tiên.

Người xây dựng (hiếm)

JS
const p = new Promise((resolve, reject) => {
  if (Math.random() > 0.5) resolve('ok');
  else reject(new Error('no'));
});

Bạn sẽ chỉ sử dụng nó khi bạn cần "hứa ​​hẹn" điều gì đó sử dụng lệnh gọi lại (ví dụ: API DOM cũ hoặc setTimeout).

Hãy thử nó

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

Xác định `promisedVersion(n)` mà, với một số, trả về một Promise được giải quyết với gấp đôi n.

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

trả về Promise.resolve(n * 2)

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

Xác định `incrementThree(p)` nhận Promise về một số và trả về Promise về số đó + 3. Sử dụng chuỗi .then.

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

p.then((n) => n + 3)

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