javascript - javascript中的数组异步调用(Promise.all)
问题描述
我想知道当我们需要对数组的每个元素调用异步函数并等待所有 Promise 解决时,最佳实践是什么。假设我们不需要更改原始数组。
例如,假设我有一个对象数组,每个对象都需要使用一个build()
函数异步构建,该函数返回一个 Promise。在按照说明继续之前,我需要等待它们建成。目前,我将执行以下操作。
async function myFunction() {
await Promise.all(myObjArray.map(myObj => myObj.build()));
{...}
}
但是,我认为这可能是一种不好的方法,因为根据文档Array.prototype.map()
,在这种情况下不应该使用该函数。但是,我不知道什么是一个好的选择,因为它不起作用。forEach
何时不使用 map()
由于 map 构建了一个新数组,因此在不使用返回的数组时使用它是一种反模式;使用 forEach 或 for...of 代替。
如果出现以下情况,您不应该使用地图:
你没有使用它返回的数组;和/或您没有从回调中返回值。
谢谢!
解决方案
根据文档,这可能是一种不好的方法,因为
Array.prototype.map()
在这种情况下不应使用该函数:由于 map 构建了一个新数组,因此在不使用返回的数组时使用它是一种反模式;使用 forEach 或 for...of 代替。
这不是一个坏方法。您正在使用返回的数组:您将其传递给Promise.all
. 没有它是行不通的。obj.build()
返回一个承诺,您需要将它们收集到一个数组中。map
是完美的解决方案。
如果承诺不满足undefined
(即没有结果),但使用构建的对象,那就更好了,这样你就可以写
async function buildFrom(oldObj) {
…
return newObj;
}
const builtObjects = await Promise.all(myObjArray.map(buildFrom));
推荐阅读
- html - CSS 复选框样式 - 大小颜色变化
- android - Android bundle 的原始文件大小有点奇怪
- node.js - 修复 Webpack 的 Watch 选项
- java - 我无法通过 Selenium Java 找到按钮
- java - 使用新的 Android Scoped Storage 将 exif 信息从一个 Uri 复制到另一个?
- c - 尝试了一个来自 ac 教程网站的例子有点弄错了
- rust - BTreeSet 包含值(使用自定义 Ord 实现)并错误地为 `contains` 返回 true
- python - 如何在 macOS 上以编程方式按名称打开应用程序?
- r - 通过 R 闪亮的 UI 对 posgresql 数据库进行多个查询
- regex - 当一个字符不是使用前缀的文件名中的前 8 个字符之一时,如何查找和替换字符?