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:
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ệ:
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.
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ó
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.
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
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.
Hiển thị gợi ý
Promise.all(tasks.map((t) => t()))
Giải pháp khả dụng sau 3 lần thử