在 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),但这会产生副作用,使脚本需要更长的时间才能完成。
我正在处理大型数组,我需要调用数组中的每一项。我正在映射数组以创建一个 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),但这会产生副作用,使脚本需要更长的时间才能完成。