在执行下一个函数之前等待 writestream 完成
wait for writestream to finish before executing next function
我有两个功能。
第一个函数读取文件夹中的所有文件并将它们的数据写入新文件。
第二个函数将新文件(函数 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 中可能有数千个输入文件,因此我需要一种动态执行的方法。
我已经尝试过 async/await、回调、承诺等,但这些东西对我来说似乎有点高级,我无法让它工作。
还有什么我可以尝试的吗?
既然您询问了同步版本,那么它可能是这样的。这应该只用在单个用户脚本或启动代码中,而不是在 运行 服务器中。服务器应该只使用异步文件 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');
我有两个功能。 第一个函数读取文件夹中的所有文件并将它们的数据写入新文件。 第二个函数将新文件(函数 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 中可能有数千个输入文件,因此我需要一种动态执行的方法。
我已经尝试过 async/await、回调、承诺等,但这些东西对我来说似乎有点高级,我无法让它工作。
还有什么我可以尝试的吗?
既然您询问了同步版本,那么它可能是这样的。这应该只用在单个用户脚本或启动代码中,而不是在 运行 服务器中。服务器应该只使用异步文件 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');