【问题标题】:Is there a way to have `readline` respond to `pause` events properly?有没有办法让 `readline` 正确响应 `pause` 事件?
【发布时间】:2019-10-26 15:51:39
【问题描述】:

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

不幸的是,我发现了"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

【问题讨论】:

    标签: node.js readline


    【解决方案1】:

    这可能会对性能产生负面影响,但我通过将 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");
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2023-03-22
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      相关资源
      最近更新 更多