【发布时间】:2019-03-25 02:55:02
【问题描述】:
我有一个文件,我想逐行读取它,对于提取的每一行,我都会执行一些昂贵的分析,然后将结果保存到数据库中。简而言之,我有这样的事情:
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);`打印所有行。因此,它不是按顺序执行的。我怎样才能确保在移动到下一行之前完成一行?
【问题讨论】:
-
您不能将所有行读入一个数组并逐个分析吗?它不会等待的原因是 await 只会阻塞该函数,它不是正在读取的承诺链,您只是在事件处理程序中等待,读者怎么知道您想等待它?
-
您目前使用
readline导入而不是一次性读取文件是否有原因? -
@Icepickle 我刚刚发现它更容易逐行阅读。但是,任何将东西存储在数组中的解决方案对我来说都很好。
标签: javascript node.js