JavaScript链接承诺返回从所有承诺返回的所有数据的数组
我有一个场景需要调用“getData”方法。这个“getData”方法将调用服务器来获取项目,然后对于每个项目,我需要获取子项目。“getData”方法应返回单个数组中所有子项的单个数组 例如,我有JavaScript链接承诺返回从所有承诺返回的所有数据的数组,javascript,arrays,promise,chaining,Javascript,Arrays,Promise,Chaining,我有一个场景需要调用“getData”方法。这个“getData”方法将调用服务器来获取项目,然后对于每个项目,我需要获取子项目。“getData”方法应返回单个数组中所有子项的单个数组 例如,我有 项目1 childA,childB,childC 项目2 奇尔德 项目3 公子,公子 我想得到一个包含 [childA, childB, childC, childD, childE, childF] 我已经尝试了以下代码,但这并不完全正确 export function g
- 项目1
- childA,childB,childC
- 项目2
- 奇尔德
- 项目3
- 公子,公子
[childA, childB, childC, childD, childE, childF]
我已经尝试了以下代码,但这并不完全正确
export function getData() {
return getItems()
.then((items) =>{
var promises = [];
items.forEach((item) => {
promises.push(
return getChildItems({
item: `${item}`,
})
.then((childItems) => {
return childItems
}),
);
});
return Promise.all(promises)
.then((allChildItems) => allChildItems);
});
}
这将返回一个数组,其中每个元素都是一个数组。顶级数组的元素数是项目数。每个子数组包含与该项的子项数匹配的元素数。比如说,
[
[childA, childB, childC],
[childD],
[childE, childF]
]
如何让它返回单个数组,如
[childA, childB, childC, childD, childE, childF]
更新:
我找到了一个解决方案,但我不认为它特别优雅。在PromiseAll中,我循环顶层项目,并将它们连接到子数组中,形成一个数组并返回它
return Promise.all(promises)
.then((arrayOfChildItemsArrays) => {
let allChildItems = []
arrayOfChildItemsArrays.map((childItemsArray) => {
allChildItems = allChildItems.concat(childItemsArray);
});
return allChildItems;
});
当然有更好的方法可以做到这一点吗?您可以通过以下方式展平阵列:
返回Promise.all(promises.then(allChildItems=>allChildItems.flat());
一种解决方案是保留当前代码并调用结果。这将为您提供一个展平阵列。这是一个略为缩短的版本:
export function getData() {
return getItems()
.then((items) => Promise.all(items.map(item => getChildItems({item: `${item}`))))
.then((childArrays) => {
return childArrays.flat(Infinity);
});
}
我在那里使用了Infinity
,但是默认值是1
,这对于您的用例来说可能已经足够好了
或者,您可以自己循环使用它们(flat
相对较新,但也很容易填充):
太棒了谢谢你的评论。在我发布我的问题后,我意识到我可以自己手动展平阵列(因此更新了帖子)。但是我不知道。平的,谢谢
export function getData() {
return getItems()
.then((items) => Promise.all(items.map(item => getChildItems({item: `${item}`))))
.then((childArrays) => {
const result = [];
for (const array of childArrays) {
result.push(...array);
}
return result;
});
}