跳转到主要内容
模块 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 次尝试后可用的解决方案