[英]Using Promise.all on the entries of a Map()
我正在使用Map来获取一些键/值对
let myMap = new Map()
myMap.set('foo', 'bar')
myMap.set('foo2', 'bar42')
对于每个Map条目,我执行一个返回Promise的函数。 所有这些Promise.all
都可以使用Promise.all
并行执行。
这就是我现在这样做的方式:
let mapPromises = []
myMap.forEach((value, key) => {
mapPromises.push(MyModel.forge({key, language, value}).save())
})
await Promise.all(mapPromises)
是否有另一种(更短?,更快?)方法来实现这一点,而不是将所有函数调用推入数组然后触发Promise.all
?
是的,使用forEach
并手动推送到阵列几乎总是一个坏主意。
async function processEntry([key, value]) {
return MyModel.forge({key, value}).save();
}
(async function() {
let myMap = new Map()
myMap.set('foo', 'bar')
myMap.set('foo2', 'bar42')
const results = await Promise.all(Array.from(myMap, processEntry));
}());
但是如果你想使用迭代器,你也可以做类似的事情
function* processEntries(map) {
for (const [key, value] of map)
yield MyModel.forge({key, value}).save();
}
(async function() {
let myMap = new Map()
myMap.set('foo', 'bar')
myMap.set('foo2', 'bar42')
const results = await Promise.all(processEntries(myMap));
}());
您可以使用Array.from()
将Map转换为对数组,键首先是值second。 然后使用array.map
构建您的array.map
数组以提供给Promise.all
。
var pairs = Array.from(myMap); // [['foo', 'bar'], ['foo2', 'bar42']]
我能提出的最简单的代码是
await Promise.all(Array.from(myMap, ([key, value]) =>
MyModel.forge({key, language, value}).save())
);
请参阅文档中的Array#
它是
const myArr = [...myMap.entries()].map(([key, value]) => {
return MyModel.forge({key, language, value}).save()
});
Promise.all(myArr);
您可以在地图上重新定义迭代器,如下所示:
myMap[Symbol.iterator] = function* () {
yield this.get("foo");
yield this.get("foo2");
};
之后你可以使用你的地图与Promise.all():
let result = await Promise.all(myMap);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.