Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript链接承诺返回从所有承诺返回的所有数据的数组_Javascript_Arrays_Promise_Chaining - Fatal编程技术网

JavaScript链接承诺返回从所有承诺返回的所有数据的数组

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

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

例如,我有

  • 项目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;
    });
}