如何同步执行功能以获得正确的输出

问题描述

我正在制作一个读取文件并逐行提取数据的应用程序。然后,将每一行存储为一个数组元素,并且需要该数组作为最终输出

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);
}