将 promise 变量拆分为命名变量

Posted

技术标签:

【中文标题】将 promise 变量拆分为命名变量【英文标题】:Split promise variable into named variables 【发布时间】:2018-02-19 06:40:36 【问题描述】:

我有这样的东西

Promise.all(
  categories.map(category => Collection.find( category ))
).then(items => 
  return items
)

然后我得到一个长度与categories 相同的数组,其中每个元素都是在特定类别中Collection 中找到的项目的数组。

我想要的是返回一个对象,其中键是类别。

所以如果我的类别是footballvolleyballmotorsport,我想要


  'football': [...],
  'volleyball': [...],
  'motorsport': [...]

而不是

[
  [...],
  [...],
  [...]
]

就像我现在一样。

如果类别的数量是静态的,我想我可以这样做

Promise.all(
  categories.map(category => Collection.find( category ))
).then(([football, volleyball, motorsport]) => 
  return 
    football,
    volleyball,
    motorsport
  
)

【问题讨论】:

分类中有没有字段包含该分类的name 【参考方案1】:

由于items数组的顺序与categories数组的顺序相似,您可以使用Array#reduce将它们组合成一个使用item的对象,以及相同索引的类别标签:

Promise.all(
  categories.map(category => Collection.find( category ))
).then(items => 
  return items.reduce((o, item, i) => 
    o[categories[i]] = item;

    return o;
  , );
)

由于您使用的是 ES6,您可能希望创建一个 Map 来代替:

Promise.all(
  categories.map(category => Collection.find( category ))
).then(items => 
  return items.reduce((map, item, i) => map.set(categories[i], item), new Map());
)

【讨论】:

谢谢!但是用reduce 再次循环整个数组是不是有点慢?不能在参数.then(.... => ...) 中拆分它吗?另外,我可以将它作为 JSON 而不是 Map 返回吗? 似乎我可以使用您的第一个解决方案来获取对象而不是地图:-D 您需要知道每个类别的名称,并且由于它们不是静态的,因此您需要再次循环。对象与地图是我写你可能想要的原因:)

以上是关于将 promise 变量拆分为命名变量的主要内容,如果未能解决你的问题,请参考以下文章

Python 将变量输出拆分为多个变量

JSON.ENCODE 将带有空格的变量拆分为多个变量

如何使用 SAS 将字符串拆分为两个变量

将日期时间列拆分为日期和时间变量

如何将文本文档批量拆分为变量

在 AngularJs 中清除服务数据