我正在使用Map来获取一些键/值对
let myMap = new Map()
myMap.set('foo', 'bar')
myMap.set('foo2', 'bar42')
对于每个Map条目,我执行一个返回Promise的函数。所有这些Promise都可以使用Promise.all
并行执行。
这就是我现在的做法:
let mapPromises = []
myMap.forEach((value, key) => {
mapPromises.push(MyModel.forge({key, language, value}).save())
})
await Promise.all(mapPromises)
是否还有另一种(更短?,更快?)方法来完成此操作,而不是将所有函数调用推入数组,然后触发Promise.all
?
答案 0 :(得分:5)
是的,使用forEach
并手动推送到数组几乎总是一个坏主意。
您可以直接创建array from地图,并在此过程中对其进行映射:
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));
}());
答案 1 :(得分:2)
您可以使用Array.from()
将地图转换为数组,首先是键,第二个是值。然后使用start(name='ServerX',type='Server',block='true')
start(name='ServerY',type='Server',block='true')
shutdown(name='ServerX',entityType='Server',ignoreSessions='true',timeOut=600,force='true',block='true')
shutdown(name='ServerY',entityType='Server',ignoreSessions='true',timeOut=600,force='true',block='true')
构建您的承诺数组,以提供给array.map
。
Promise.all
答案 2 :(得分:2)
我能提出的最简单的代码是
await Promise.all(Array.from(myMap, ([key, value]) =>
MyModel.forge({key, language, value}).save())
);
请参阅Array#from文档
答案 3 :(得分:1)
是
const myArr = [...myMap.entries()].map(([key, value]) => {
return MyModel.forge({key, language, value}).save()
});
Promise.all(myArr);
答案 4 :(得分:1)
您可以像这样在地图上重新定义迭代器:
myMap[Symbol.iterator] = function* () {
yield this.get("foo");
yield this.get("foo2");
};
之后,您可以将Map与Promise.all()一起使用:
let result = await Promise.all(myMap);