【发布时间】:2020-06-13 23:48:35
【问题描述】:
我有以下代码:
const fs = require("fs");
const {createInterface} = require("readline");
const {join} = require("path");
const {once} = require("events");
async function readMeta (path) {
const meta = {};
const rs = fs.createReadStream(path);
const lineReader = createInterface({input: rs});
let linesRead = 0;
lineReader.on("line", line => {
switch (linesRead) {
case 0:
meta.name = line;
break;
case 1:
meta.tags = line.split(" ");
break;
case 2:
meta.type = line;
break;
case 3:
meta.id = +line;
}
if (++linesRead === 4) {
lineReader.close();
}
});
await once(lineReader, "close");
rs.close();
return meta;
}
它似乎正在工作,但是当line 事件触发时记录这些行会显示其他情况。在调用 lineReader.close() 后仍会触发该事件,从而导致读取整个文件。我不知道是什么原因造成的。我发现了一些显然可以完成这项工作的模块,但如果可能的话,我希望降低依赖关系。
【问题讨论】:
-
更好
await once(lineReader, 'end');github.com/maleck13/readline/blob/master/readline.js#L51 文件可能不会关闭或关闭很快,但你的目标是在它结束阅读时捕捉。 -
我不确定我明白你的意思,我的目标是让它停止阅读,我不想阅读整个文件。
-
在
lineReader.close();之后立即调用rs.close();怎么样,因为行阅读器从未关闭的读取流中获取输入 -
rs在lineReader触发close事件时被关闭。 -
please read" nodejs.org/api/readline.html#readline_rl_close
Calling rl.close() does not immediately stop other events (including 'line') from being emitted by the readline.Interface instance.这意味着您必须先关闭读取流