Promise 是 JavaScript 中异步代码不可或缺的一部分。我们经常遇到需要同时运行多个相互独立的 Promise。我们可以通过使用 JavaScript 的Promise.all
. Promise.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?