【发布时间】:2021-03-10 02:13:22
【问题描述】:
我正在循环一个数组并从一个 CSV 文件中读取数据,这样我就可以减少它的数据,我已经实现了这样的东西。我想从内存中的 csv 文件填充 Map 变量并从中获取数据。但我想填充一次(或者当我明确这样做时,但那是另一回事)。
运行时我想这样打印:
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([]));
【问题讨论】:
标签: javascript arrays csv async-await