等待写流完成,然后再执行下一个功能

时间:2020-07-03 16:45:32

标签: node.js fs synchronous

我有两个职能。 第一个功能读取文件夹中的所有文件,并将其数据写入新文件。 第二个函数将新文件(函数1的输出)作为输入并创建另一个文件。因此,它必须等到功能1的写入流完成。

const fs = require('fs');
const path = require('path');

function f1(inputDir, outputFile) {
    let stream = fs.createWriteStream(outputFile, {flags:'a'}); // new data should be appended to outputFile piece by piece (hence flag a)
    let files = await fs.promises.readdir(inputDir);

    for(let file of files) {
        let pathOfCurrentFile = path.join(inputDir, file);
        let stat = fs.statSync(pathOfCurrentFile);
        if(stat.isFile()) {
            data = await fs.readFileSync(pathOfCurrentFile, 'utf8');

            // now the data is being modified for output
            let result = data + 'other stuff';
            stream.write(result);
        }
    }
    stream.end();
}

function f2(inputFile, outputFile) {
    let newData = doStuffWithMy(inputFile);
    let stream = fs.createWriteStream(outputFile);
    stream.write(newData);
    stream.end();
}

f1('myFiles', 'myNewFile.txt');
f2('myNewFile.txt', 'myNewestFile.txt');

发生了什么事

  • 'myNewFile.txt'(f1的输出)已正确创建
  • 'myNewestFile.txt'已创建,但为空或仅包含一个或两个单词(应包含一个长文本)

当我在执行f2之前使用超时时,它可以很好地工作,但是我不能使用超时,因为inputDir中可以有成千上万个输入文件,因此我需要一种动态地进行操作的方法。

我已经尝试过异步/等待,回调,promise等。但是,对于我来说,这些东西似乎有些高级,我无法使其正常工作。

还有什么我可以尝试的吗?

1 个答案:

答案 0 :(得分:1)

由于您询问了同步版本,因此看起来可能是这样。仅应在单个用户脚本或启动代码中使用它,而不能在运行的服务器中使用。服务器只能使用异步文件I / O。

// synchronous version
function f1(inputDir, outputFile) {
    let outputHandle = fs.openSync(outputFile, "a");
    try {
        let files = fs.readdirSync(inputDir, {withFileTypes: true});
        for (let f of files) {
            if (f.isFile()) {
                let pathOfCurrentFile = path.join(inputDir, f.name);
                let data = fs.readFileSync(pathOfCurrentFile, 'utf8');
                fs.writeSync(outputHandle, data);
            }
        }
    } finally {
        fs.closeSync(outputHandle);
    }
}

function f2(inputFile, outputFile) {
    let newData = doStuffWithMy(inputFile);
    fs.writeFileSync(outputFile, newData);
}

f1('myFiles', 'myNewFile.txt');
f2('myNewFile.txt', 'myNewestFile.txt');