gpt4 book ai didi

node.js - 有没有办法让 `readline` 正确响应 `pause` 事件?

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:03 25 4
gpt4 key购买 nike

我正在尝试编写一个 Markdown 预处理器,它可以在输出中包含其他文件。

不幸的是,我发现"the pause method does not stop queued up line events" .

我编写的解决方案将完成原始文件的读取和写入,然后在最后附加其他文件:

import { createInterface } from "readline";
import * as fs from "fs";
import * as path from "path";
import minimist from "minimist";

const argv = minimist(process.argv.slice(2));

const inputFile = path.resolve(argv._[0]);
const outputFile = path.resolve(argv._[1]);

const inputFileReadStream = createInterface({
"input": fs.createReadStream(inputFile)
});

const writeStream = fs.createWriteStream(outputFile);

readStream.on("line", function readLine(line) {
if (line.startsWith("@import") === true) {
inputFileReadStream.pause();

console.log(line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\"")));

const readStream = createInterface({
"input": fs.createReadStream(path.resolve(path.dirname(inputFile), line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\""))))
});

readStream.on("line", function(line) {
readLine(line);
});

readStream.on("end", function() {
inputFileReadStream.resume();
});
} else {
writeStream.write(line + "\n");
}
});

所以我尝试修改它以使用 line-by-line我链接的帖子中提到的库,看看这是否有效:

let readStream = new (require("line-by-line"))(fs.createReadStream(inputFile));

const writeStream = fs.createWriteStream(outputFile);

readStream.on("line", function readLine(line) {
if (line.startsWith("@import") === true) {
const tempStream = readStream;

tempStream.pause();

console.log(line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\"")));

readStream = new (require("line-by-line"))(fs.createReadStream(path.resolve(path.dirname(inputFile), line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\"")))));

readStream.on("line", function(line) {
readLine(line);
});

readStream.on("end", function() {
tempStream.resume();
});
} else {
writeStream.write(line + "\n");
}
});

但这生成了一个文件,该文件逐渐将导入文件中的行散布到主文件中。

我的问题是:有没有办法让 readline 正确响应 pause 事件?

这可以用 Transform 来修复吗? ?

如果有帮助,这里是存储库的链接:https://github.com/brianjenkins94/Rosettas-Node

最佳答案

这可能会对性能产生负面影响,但我通过将 highWaterMark 值设置为 1 得到了我想要的结果。

import { createInterface } from "readline";
import * as fs from "fs";
import * as path from "path";
import minimist from "minimist";

const argv = minimist(process.argv.slice(2));

const inputFile = path.resolve(argv._[0]);
const outputFile = path.resolve(argv._[1]);

const inputFileReadStream = createInterface({
"input": fs.createReadStream(inputFile, { "highWaterMark": 1 })
});

const writeStream = fs.createWriteStream(outputFile);

inputFileReadStream.on("line", function readLine(line, readStream = inputFileReadStream) {
if (line.startsWith("@import") === true) {
readStream.pause();

const childReadStream = createInterface({
"input": fs.createReadStream(path.resolve(path.dirname(inputFile), line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\""))), { "highWaterMark": 1 })
});

childReadStream.on("line", function(line) {
readLine(line, childReadStream);
});

childReadStream.on("close", function() {
readStream.resume();
});
} else {
writeStream.write(line + "\n");
}
});

关于node.js - 有没有办法让 `readline` 正确响应 `pause` 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58572327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com