在 JavaScript 中加速 Promise

Promise 是 JavaScript 中异步代码不可或缺的一部分。我们经常遇到需要同时运行多个相互独立的 Promise。我们可以通过使用 JavaScript 的Promise.allPromise.all是 JavaScript 提供的一个 Promise,它接受一个 Promise 数组,并在所有 Promise 都被解决时解决。

假设您要从 3 个不同的 API 获取数据。每个 API 大约需要 3 秒来响应。没有并发的普通代码如下所示:

async function fetchData() {
  const metadata = await getMetadata(); 
  const products = await getProducts();
  const categories = await getCategories();

  return { metadata, products, categories };
}

上面的代码工作正常。但是可以通过利用并发来改进。我们不需要按顺序运行它们,因为这三个函数都是相互独立的。metadata我们之前不需要products。我们可以像这样重写上面的代码片段:

async function fetchData() {
  const metadata = getMetadata();
  const products = getProducts();
  const categories = getCategories();

  return await Promise.all([
    metadata,
    products,
    categories,
  ]);
}

现在我们不是在等待metadata之前products。相反,所有数据都会同时获取。这种技术非常强大,可以加速你的代码。这种技术还可以根据某个输入来获取数据。假设您要获取产品列表的产品详细信息。你可以像这样重构你的承诺:

async function fetchProductDetails(ids) {
  const productDetails = await Promise.all(
    ids.map(id => getProduct(id))
  );
  
  return productDetails;
}

由于 JavaScript 是单线程的,除非您为每个 Promise 创建一个子进程,否则无法实现并行性。生成一个进程是一项昂贵的操作,并且有一些开销使其不太可行。Promise.all是实现并发和加快代码速度的好选择。同样,这取决于您要解决的问题。你有什么技术可以加速 JavaScript 中的 Promise?