将 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
中找到的项目的数组。
我想要的是返回一个对象,其中键是类别。
所以如果我的类别是football
、volleyball
和motorsport
,我想要
'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 变量拆分为命名变量的主要内容,如果未能解决你的问题,请参考以下文章