javascript - JavaScript 链接承诺返回从所有承诺返回的所有数据的数组
问题描述
我有一个需要调用“getData”方法的场景。这个“getData”方法将调用服务器来获取项目,然后对于每个项目我需要获取子项目。“getData”方法应返回单个数组中所有子项的单个数组。
例如,我有
- 项目1
- 孩子A,孩子B,孩子C
- 项目2
- 儿童D
- 第 3 项
- 孩子E,孩子F
我想得到一个包含
[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;
});
当然有更好的方法来做到这一点?
解决方案
您可以通过以下方式展平阵列Array.prototype.flat
:
return Promise.all(promises).then(allChildItems => allChildItems.flat());
推荐阅读
- javascript - Javascript中的文本数组到数组
- php - 远程 MySQL 服务器没有响应
- javascript - 使用 v-if 隐藏和显示元素
- sql - 以 7 位数字结尾的字段的 Big Query SQL 正则表达式
- regex - 使正则表达式与 sed 一起使用以捕获 git repo 名称
- node.js - 为什么this.props.param.match.id未定义,导致Express报错?
- php - 如何在 WordPress 主题中创建指向页面的链接
- node.js - 猫鼬快递计数器不增加,范围问题
- asp.net-mvc - 使用带有实体框架、UnityConfig 和多租户的 ASP.NET MVC 处理 DB 事务/DbContext
- java - 带有 Undertow 的 MockServer