我正在循环数组并从CSV文件读取,以便我可以减少其数据,我已经实现了这样的东西。我想有一个地图变量从内存中的csv文件填充,并从中获取数据。但是我想填充它一次(或者当我显式地这样做时,但那是另一回事)。
运行时,我想这样打印:
before
after
但是我得到了这个:
before
before
before
after
after
after
显然,从CSV读取时没有等待。我能从CSV异步读取吗?
这是我的代码:
let myMap = new Map();
const parseMap = async(stream) => {
const map = new Map();
return new Promise((resolve, reject) => {
stream
.on('data', elems => {
const key = elems[0];
const value = elems.slice(-1)[0];
map.set(key, value);
})
.on('error', () => reject)
.on('end', () => {
console.log('promise');
resolve(map);
});
});
}
const getMap = async(path_string) => {
const stream = fs.createReadStream(path_string).pipe(parse({delimiter: DELIMITER}));
return await parseMap(stream);
}
const translate = async (key) => {
if (!myMap.size) {
console.log('before');
myMap = await getMap('my-csv.csv');
console.log('after');
}
return myMap.get(key);
};
const guidRankings = await ['a', 'b', 'c'].reduce(async (accumulator, value, idx) => {
const data = await translate(value);
if (data) {
(await accumulator).push({
data,
order: idx
});
}
return accumulator;
}, Promise.resolve([]));
reduce
方法不能处理异步回调。
你需要传递给它一个函数,返回你关心的实际值,而不是返回一个承诺。
map
你的数组值通过translate
得到数组的承诺- 使用
await Promise.all
等待它们全部解决并获得翻译值的数组 reduce
这个数组(不做任何异步在reducer内部)。
假设3个调用可以同时进行,只需使用map来存储Promise,使用Promise All来等待它们完成,然后使用map来获取您的数组。
const promises = ['a', 'b', 'c'].map(value) => translate(value));
const results = await Promise.all(promises);
const guidRankings = results.map((data, order) => ({ data, order }));
如果由于某种原因它们必须一次创建一个,那么你想使用for await