读取csv异步- NodeJS



我正在循环数组并从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方法不能处理异步回调。

你需要传递给它一个函数,返回你关心的实际值,而不是返回一个承诺。

  1. map你的数组值通过translate得到数组的承诺
  2. 使用await Promise.all等待它们全部解决并获得翻译值的数组
  3. 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

最新更新