首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法让`readline`正确响应`pause`事件?

有没有办法让`readline`正确响应`pause`事件?
EN

Stack Overflow用户
提问于 2019-10-26 23:51:40
回答 1查看 73关注 0票数 1

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

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

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

代码语言:javascript
复制
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库,看看是否可以工作:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2019-10-27 11:21:05

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

代码语言:javascript
复制
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");
    }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58572327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档