问题描述
我正在制作一个读取文件并逐行提取数据的应用程序。然后,将每一行存储为一个数组元素,并且需要该数组作为最终输出。
const fs = require('fs');
const readline = require('readline');
var output_array=[];
const readInterface = readline.createInterface({
input: fs.createReadStream(inp_file),console: false
});
readInterface.on('line',function(line) {
//code for pushing lines into output_array after doing conditional formatting
}
callback (null,output_array);
有了这个,我得到了一个空数组。 虽然如果我使用“ setTimeout”,那么它工作正常
setTimeout(() => {
callback (null,output_array);
},2000);
如何在不使用'setTimeout'的情况下同步执行此操作?
解决方法
您不能同步执行异步功能。但是readline
支持close
事件,该事件在完全读取输入文件时触发,因此您可以在此处调用回调。
readInterface.on('close',() => {
callback(null,output_array);
});
,
您当然可以在close
事件上输出内容,但是您也可以像这样使用promise
:
function readFile(fileName) {
return new Promise((resolve,reject) => {
const readInterface = readline.createInterface({
input: fs.createReadStream(fileName).on('error',error => {
// Failed to create stream so reject.
reject(error);
}),});
const output = [];
readInterface.on('error',error => {
// Some error occurred on stream so reject.
reject(error);
});
readInterface.on('line',line => {
output.push(line);
});
readInterface.on('close',() => {
// Resolve the promise with the output.
resolve(output);
});
});
}
readFile(inp_file)
.then(response => {
callback(null,response);
})
.catch(error => {
// Take care of any errors.
});
我在调用console
时删除了createInterface()
设置,因为它似乎不是有效的option
。
从readline's close event处理程序中进行回调。这样,您的回调将在读取所有行之后发生。
readInterface.on('close',function(line) {
callback (null,output_array);
}