繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM