首页 > 解决方案 > JavaScript 链接承诺返回从所有承诺返回的所有数据的数组

问题描述

我有一个需要调用“getData”方法的场景。这个“getData”方法将调用服务器来获取项目,然后对于每个项目我需要获取子项目。“getData”方法应返回单个数组中所有子项的单个数组。

例如,我有

我想得到一个包含

[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;
});

当然有更好的方法来做到这一点?

标签: javascriptarrayspromisechaining

解决方案


您可以通过以下方式展平阵列Array.prototype.flat

return Promise.all(promises).then(allChildItems => allChildItems.flat());

推荐阅读