模块 8 · 第 4 课(共 4)课程中的32/32~15 min
模块课程(4/4)
挑战:使用 Promise 进行调度
“调度”意味着决定如何运行一系列异步任务:全部一起运行,一次一个,
或以小组形式进行。我们将结合 Promise.all、for await 和闭包。
并行:全部一起
当任务独立且快速时,启动它们并使用 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]总时间 ≈ 最慢任务的时间。
系列:一次一个
当每项任务 依赖于 前一项任务,或者您想要进行速率限制时:
JS
async function inSerie(tasks) {
const risultati = [];
for (const t of tasks) {
risultati.push(await t());
}
return risultati;
}总时间 ≈ 次数的总和。
有并发限制
有时你不想要一千个并发请求,但你又不想等待它们 系列之一:您想要飞行中的 N 最大。
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;
}这个想法:你启动 n “workers”来获取下一个索引,直到没有任何剩余。
尝试一下
锻炼#js.m8.l4.e1
尝试:0加载中...
定义“inSeries(tasks)”异步:给定一组返回 Promises 的函数,一次运行它们(等待)并按执行顺序返回结果数组。
正在加载编辑器...
显示提示
for ... of 并推送(等待 t())
3 次尝试后可用的解决方案
复习练习
锻炼#js.m8.l4.e2
尝试:0加载中...
定义“inParallel(tasks)”异步:给定返回 Promises 的函数数组,并行启动它们并按照与输入相同的顺序返回结果数组。使用 Promise.all。
正在加载编辑器...
显示提示
Promise.all(tasks.map((t) => t()))
3 次尝试后可用的解决方案