我有一个文件,我想逐行读取它,对于提取的每一行,我都会执行一些昂贵的分析,然后将结果保存到数据库中。简而言之,我有这样的东西:
const fs = require('fs');
const path = require('path');
const readline = require('readline');
async function analyzeAndSave(url) {
// Removed for brevity, but this function takes a minute or so finsh.
}
async function run() {
try {
const dataPath = path.join(path.dirname(require.main.filename), 'data/urls.txt');
const rl = readline.createInterface({
input: fs.createReadStream(dataPath),
});
let line_no = 0;
rl.on('line', async (url) => {
line_no++;
logger.info(`Analyzing: ${url}`);
await analyzeAndSave(url);
});
} catch (err) {
// Error caught.
logger.error(err);
}
}
run();
这样做的问题是,我注意到它并不是等待一行的分析完成,而是尝试执行多个分析实例。我认为这是因为它最初使用logger.info('Analyzing: ' + url
);`打印所有行。因此,它不是按顺序执行的。如何确保一行结束后再转到下一行?
发布于 2019-03-25 00:02:18
readline接口异步地发出"on“事件,并且在其中一个事件中执行await
并不会阻止其他事件被触发。相反,您可以缓冲数组中的行,如下所示:
r.on('line', url => urls.push(url));
r.on('close', async () => {
for (const url of urls) {
await analyzeAndSave(url);
}
});
其中在创建readline接口之前将urls
初始化为空数组。
https://stackoverflow.com/questions/55325415
复制相似问题