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

Thách thức: lập lịch với Promises

"Lập lịch" có nghĩa là quyết định cách chạy danh sách các tác vụ không đồng bộ: tất cả cùng nhau, mỗi lần một tác vụ, hoặc theo nhóm nhỏ. Chúng tôi sẽ kết hợp Promise.all, for await và các lần đóng.

Song song: tất cả cùng nhau

Khi các tác vụ độc lập và nhanh chóng, hãy khởi chạy tất cả chúng và chờ với Promise.all:

JS
async function inParallelo(tasks) {
  return Promise.all(tasks.map((t) => t()));
}

const risultati = await inParallelo([
  () => Promise.resolve(1),
  () => Promise.resolve(2),
  () => Promise.resolve(3),
]);
// [1, 2, 3]

Tổng thời gian ≈ thời gian của tác vụ chậm nhất.

Trong chuỗi: từng cái một

Khi mỗi nhiệm vụ phụ thuộc vào nhiệm vụ trước đó hoặc bạn muốn giới hạn tỷ lệ:

JS
async function inSerie(tasks) {
  const risultati = [];
  for (const t of tasks) {
    risultati.push(await t());
  }
  return risultati;
}

Tổng thời gian ≈ tổng số lần.

Với giới hạn đồng thời

Đôi khi bạn không muốn có hàng nghìn yêu cầu đồng thời, nhưng bạn cũng không muốn đợi chúng trong hoặc loạt: bạn muốn có tối đa N trong chuyến bay.

JS
async function conLimite(tasks, n) {
  const risultati = new Array(tasks.length);
  let i = 0;
  async function worker() {
    while (i < tasks.length) {
      const mio = i++;
      risultati[mio] = await tasks[mio]();
    }
  }
  await Promise.all(Array.from({ length: n }, worker));
  return risultati;
}

Ý tưởng: bạn khởi chạy n "công nhân" lấy chỉ mục tiếp theo cho đến khi không còn gì.

Hãy thử nó

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

Xác định `inSeries(task)` async: đưa ra một mảng hàm trả về Promise, chạy từng hàm một (đang chờ) và trả về mảng kết quả theo thứ tự thực hiện.

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

cho ... của và đẩy(await t())

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

Xác định `inParallel(task)` async: đưa ra một mảng hàm trả về Lời hứa, khởi chạy tất cả chúng song song và trả về một mảng kết quả theo cùng thứ tự với đầu vào. Sử dụng Promise.all.

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

Promise.all(tasks.map((t) => t()))

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