Javascript 中的异步编程 - Promise.all() 未按预期工作

Async programing in Javascript - Promise.all() do not work as expected

我在 Javascript 中陷入 异步编程。 我知道 Promise.all() 将 运行 并行。

你能告诉我下面这段代码有什么问题吗?

应该 100ms。但实际上,需要 200ms :(

// 1. Define function here
var getFruit = async (name) => {
  const fruits = {
    pineapple: ":pineapple:",
    peach: ":peach:",
    strawberry: ":strawberry:"
  };
  await fetch('https://jsonplaceholder.typicode.com/photos'); // abount 100ms 
  return fruits[name];
};

var makeSmoothie = async () => {
  const a = getFruit('pineapple');
  const b = getFruit('strawberry');
  const smoothie = await Promise.all([a, b]);
  return smoothie;
  //return [a, b];
};
  
/// 2. Execute code here
var tick = Date.now();
var log = (v) => console.log(`${v} \n Elapsed: ${Date.now() - tick}`);
makeSmoothie().then(log);

你的逻辑很好,它是 运行 从客户端尽可能并行。

您可以通过等待 setTimeout 而不是获取来测试它:

await new Promise(resolve => setTimeout(resolve, 100));

占位符网站可能正在排队连接或其他什么。无论哪种方式,您都应该使用可预测的东西而不是网络来衡量。

编辑:

只是为了解释更多不适合评论的内容。

让我们把我的等待技巧放到一个实际的函数中:

const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

好的,现在您可以将其称为 await wait(100)。现在比较:

  • await wait(100)
  • await fetch(...)

就您的代码设置而言,它们是相同的。他们正在执行一些大约需要 100 毫秒和 returns 的异步任务。如果 Promise.all() 不是 运行 这个并行, wait(100) 版本肯定需要 200ms 或更长时间。

fetch 不如 setTimeout 可靠,因为它是 运行 通过网络进行的测试。您无法通过此调用控制很多事情,例如:

  • 一些浏览器限制了对同一域的并行连接数
  • DNS 或服务器本身滞后,典型的网络问题
  • 域本身可能一次强制从您的 IP 建立 1 个连接

目前还不清楚是什么导致了这里明显的同步行为。也许您会在网络面板中找到一些答案。但就代码而言,您没有其他事情可做。它可证明与 setTimeout 测试并行,后者作为测试更可靠,因为它只是一个本地计时器。