为什么不在回调中触发事件的嵌套readline?

时间:2016-12-10 03:48:46

标签: node.js readline fs

我正在尝试在node.js中实现inplace文件编辑,在这种情况下,在第10行附近的文件中添加一行。喜欢:

perl -pi -e '$. == 11 && print "adding a line\n"' input.txt

这个想法是打开文件进行读取,取消链接,然后打开相同的文件名进行写入(现在是新的inode)并逐行读取并进行任何更改并逐行写入。

如果我使用fs.unlinkSync,一切正常。但是如果我尝试使用fs.unlink和回调,那么inFh.on('line',...)事件不会触发(或者任何术语都是正确的,那部分永远不会明显地运行)。

同步版本(有效):

'use strict';
const readline = require('readline');
const fs = require('fs');

const inFh = readline.createInterface({
        input: fs.createReadStream('input.txt')
});

function addBad() {
    const outFh = fs.createWriteStream('input.txt');
    outFh.on('open', () =>{
        let x = 0;
        inFh.on('line', (line) => {
            if (x++ == 10) outFh.write("adding a line\n");
            outFh.write(line+"\n");
        });
    });
}

fs.unlinkSync('input.txt');
addBad();

这是破损的回调版本:

'use strict';
const readline = require('readline');
const fs = require('fs');

const inFh = readline.createInterface({
        input: fs.createReadStream('input.txt')
});

function addBad() {
    const outFh = fs.createWriteStream('input.txt');
    outFh.on('open', () =>{
        let x = 0;
        inFh.on('line', (line) => {
            if (x++ == 10) outFh.write("adding a line\n");
            outFh.write(line+"\n");
        });
    });
}

fs.unlink('input.txt', () => { addBad() });

0 个答案:

没有答案