在 async/await 中解构 Promise.all 的结果?

De-structure the result of Promise.all in async/await?

我正在处理大型数组,我需要调用数组中的每一项。我正在映射数组以创建一个 axios 调用数组,然后使用 Promise.all 一次等待所有承诺。但是,axios returns 是一个大对象,我真正需要的是数据键下的内容。有没有办法在 Promise.all 中解构它以获得返回的主体?

我知道我可以在 Promise.all 之后立即映射,但这也有开销,而且数组非常大,我想尽可能节省内存。

const largeArrOfIds = [1,2,3,4...]

const mappedCalls = largeArrOfIds.map(x=> axios({
  url: `exampleurl.com/${x}`,
  headers
}))

const result = await Promise.all(mappedCalls)

// Result here looks like this:

result = [{
  config: {11},
  data: {1},
  headers: {17},
  request: {38},
  status: 200,
  ...
},{another}, {another}, ...]

// But I really just want an array of all the "data" and 
// I don't want the memory to be used to hold all the other data. 

谢谢大家!

最好的方法是将后端更改为只为您提供您想要的值,而不是必须请求所有内容然后仅过滤 属性 你想要在你的本地脚本中。

缺少那个 - 无论您使用什么方法,所有值都将在脚本执行期间的 某个 点加载到内存中。如果数据量真的太大了,这是一个问题,我能想到的唯一减少负载的方法是在 axios 调用之后放置一个 .then ,并且只提取 属性你想要 - 这样,一旦单个请求得到解决,只有你需要的值会被半永久保存,其余的可以自由地被垃圾收集。

const mappedCalls = largeArrOfIds.map(x=> 
  axios({
    url: `exampleurl.com/${x}`,
    headers
  })
    .then(result => result.data)
)

但这不太可能产生太大影响,因为垃圾收集器通常相隔 运行 ,而不是 毫秒 分开 - 即使你有很多请求,也不太可能需要超过一两秒的时间来解决所有这些问题(因此 GC 可能没有时间 运行 在所有完成之前无论如何一切都在记忆中)。

如果你真的想在任何给定时间减少整体内存使用量,我想你可以连续发出请求,而不是使用 Promise.all(如果你真的想使用 FinalizationRegistry fancy),但这会产生副作用,使脚本需要更长的时间才能完成。