在Map()的条目上使用Promise.all

时间:2017-03-27 22:57:41

标签: javascript ecmascript-6 promise async-await

我正在使用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

5 个答案:

答案 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);