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

Hed*_*dge 2 javascript promise async-await ecmascript-6

我正在使用Map来获取一些键/值对

let myMap = new Map()
myMap.set('foo', 'bar')
myMap.set('foo2', 'bar42')
Run Code Online (Sandbox Code Playgroud)

对于每个Map条目,我执行一个返回Promise的函数.所有这些Promise都可以使用并行执行Promise.all.

这就是我现在这样做的方式:

let mapPromises = []
myMap.forEach((value, key) => {
  mapPromises.push(MyModel.forge({key, language, value}).save())
})
await Promise.all(mapPromises)
Run Code Online (Sandbox Code Playgroud)

是否有另一种(更短?,更快?)方法来实现这一点,而不是将所有函数调用推入数组然后触发Promise.all

Ber*_*rgi 5

是的,使用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));
}());
Run Code Online (Sandbox Code Playgroud)

但是如果你想使用迭代器,你也可以做类似的事情

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));
}());
Run Code Online (Sandbox Code Playgroud)


Jar*_*a X 5

我能想到的最简单的代码是

await Promise.all(Array.from(myMap, ([key, value]) => 
    MyModel.forge({key, language, value}).save())
);
Run Code Online (Sandbox Code Playgroud)

请参阅Array#from文档