Javascript Node JS同步读取一行文本

Javascript Node JS同步读取一行文本,javascript,node.js,typescript,Javascript,Node.js,Typescript,我有下面这个例子,其中我有data.txt,包含数千行 我的目标是读取这些文件的每一行,提取一些数据并将其存储在一个数组中。我使用readline和fs.createReadStream 以下是我所做的: const readingText = async () => { const fileStream = fs.createReadStream( "./data.txt" ); const rl = readline.createInterface({ i

我有下面这个例子,其中我有
data.txt
,包含数千行

我的目标是读取这些文件的每一行,提取一些数据并将其存储在一个数组中。我使用
readline
fs.createReadStream

以下是我所做的:

const readingText = async () => {
  const fileStream = fs.createReadStream(
    "./data.txt"
  );

  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  });

  let dd = [];
  rl.on("line", line => {
    dd.push(line.split(":")[1]);
  });
  rl.on("close", async line => {
    console.log(dd);
    return dd;
  });
};

const someFunc = async () => {
  try {
    const ff = await readingText();
    console.log(ff);
  } catch (err) {
    console.log(err);
    return false;
  }
};

someFunc();
问题是
console.log(ff)
将始终返回
undefined
,而
console.log(dd)
正确返回所需的
dd
数组,这是为什么?以及如何使
console.log(ff)
等待
ff
变量被分配给
dd
数组的值


感谢

基于事件的执行不会等待父异步函数

试试这个:

const readingText = async () => {
  return new Promise((resolve, reject) => {
    const fileStream = fs.createReadStream(
      "./data.txt"
    );

    const rl = readline.createInterface({
      input: fileStream,
      crlfDelay: Infinity
    });

    let dd = [];
    rl.on("line", line => {
      dd.push(line.split(":")[1]);
    });
    rl.on("close", line => {
      console.log(dd);
      return resolve(dd);
    });
  });

};

const someFunc = async () => {
  try {
    const ff = await readingText();
    console.log(ff);
  } catch (err) {
    console.log(err);
    return false;
  }
};

someFunc();

基于事件的执行不会告诉异步函数按照return语句等待和终止。您可能希望将其包装在承诺中,然后将someFunc与wait一起使用。如何操作?添加作为答案。此外,我跳过了拒绝部分。如果rl.on('error'),您可能希望拒绝承诺,以便获得正确的try/catch流。是的,感谢将承诺包装在里面是我刚刚意识到的好技巧。