【问题标题】:JavaScript appends/writes strings in the wrong orderJavaScript 以错误的顺序追加/写入字符串
【发布时间】:2020-08-30 01:47:12
【问题描述】:

我正在为 vscode 写一个扩展,这是我第一次使用 JS(node.js,不知道有没有区别),除了fs.append() 函数外,它都很好用。

似乎混淆了输入,所以如果输入是:

Foo
Bar

它有时会输出:

Bar
Foo

但它不会一直发生,我不太明白为什么。

这是我的代码(至少是重要部分)

const fs = require('fs');

var path = 'includes/hello/hello.cpp';
var file = '.vscode/tasks.json';
var lineReader = require('readline').createInterface({
input: fs.createReadStream(file)});
lineReader.on('line', function(line) {
    fs.appendFile(file, line + '\n', function(err) {
        if(err) {
            return console.error(err);
        }
    });
});

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    您在调用.appendFile 时没有等待上一次调用完成,因此无法保证顺序,您应该为此使用WriteableStream 并使用split2 拆分新行,以便更容易控制@ WriteableStream 的 987654322@,因为您可以在需要时暂停/恢复流。

    const fs = require('fs');
    const path = 'includes/hello/hello.cpp';
    const file = '.vscode/tasks.json';
    const split2 = require('split2')
    const { once } = require('events');
    
    
    const writer = fs.createWriteStream('somefile', { flag: 'a' });
    
    const stream = fs.createReadStream(file)
        .pipe(split2())
    
    stream.on('data', async function (line) {
        if(!writer.write(line + '\n')) {
          stream.pause();
          await once(writer, 'drain'); // handle backpressure
          stream.resume();
        }
    })
    

    现在.write 将确保以正确的顺序写入块。

    另一种方法是创建一个额外的TransformStream 并改用.pipe

    const { Transform } = require('stream')
    
    /* ... */
    
    const myTransform = new Transform({
      transform(chunk, encoding, callback) {
        const newLine = Buffer.from('\n');
        // Do any transformation here
        callback(null, Buffer.concat([chunk, newLine]));
      }
    });
    
    fs.createReadStream(file)
        .pipe(split2())
        .pipe(myTransform)
        .pipe(writer)
    

    【讨论】:

    • 我只是尝试了第一种方法,但它似乎出于某种原因删除了文件中的所有内容
    • 抱歉,您必须在createWriteStream 上使用a 标志
    • 当我在createWriteStream 上添加a 标志时,它似乎只是不执行stream.on() 函数中的任何代码
    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 2011-03-31
    • 2019-06-19
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多