Tôi tình cờ thấy trang này trong khi cố gắng giải quyết vấn đề trong NodeJS: tập hợp lại các khối tệp. Về cơ bản: Tôi có một loạt tên tập tin. Tôi cần nối thêm tất cả các tệp đó, theo đúng thứ tự để tạo một tệp lớn. Tôi phải làm điều này không đồng bộ.
Mô-đun 'fs' của Node cung cấp appendFileSync nhưng tôi không muốn chặn máy chủ trong hoạt động này. Tôi muốn sử dụng mô-đun fs.promises và tìm cách xâu chuỗi các công cụ này lại với nhau. Các ví dụ trên trang này không hoạt động với tôi vì tôi thực sự cần hai thao tác: fsPromises.read () để đọc trong đoạn tệp và fsPromises.appendFile () để nối với tệp đích. Có lẽ nếu tôi tốt hơn với javascript, tôi có thể làm cho các câu trả lời trước hoạt động với tôi. ;-)
Tôi tình cờ phát hiện ra điều này ... https://css-tricks.com/why-USE-reduce-to- resultively-resolve-promises-works
/
... và tôi đã có thể hack cùng một giải pháp làm việc.
TLDR:
/**
* sequentially append a list of files into a specified destination file
*/
exports.append_files = function (destinationFile, arrayOfFilenames) {
return arrayOfFilenames.reduce((previousPromise, currentFile) => {
return previousPromise.then(() => {
return fsPromises.readFile(currentFile).then(fileContents => {
return fsPromises.appendFile(destinationFile, fileContents);
});
});
}, Promise.resolve());
};
Và đây là một bài kiểm tra đơn vị hoa nhài cho nó:
const fsPromises = require('fs').promises;
const fsUtils = require( ... );
const TEMPDIR = 'temp';
describe("test append_files", function() {
it('append_files should work', async function(done) {
try {
// setup: create some files
await fsPromises.mkdir(TEMPDIR);
await fsPromises.writeFile(path.join(TEMPDIR, '1'), 'one');
await fsPromises.writeFile(path.join(TEMPDIR, '2'), 'two');
await fsPromises.writeFile(path.join(TEMPDIR, '3'), 'three');
await fsPromises.writeFile(path.join(TEMPDIR, '4'), 'four');
await fsPromises.writeFile(path.join(TEMPDIR, '5'), 'five');
const filenameArray = [];
for (var i=1; i < 6; i++) {
filenameArray.push(path.join(TEMPDIR, i.toString()));
}
const DESTFILE = path.join(TEMPDIR, 'final');
await fsUtils.append_files(DESTFILE, filenameArray);
// confirm "final" file exists
const fsStat = await fsPromises.stat(DESTFILE);
expect(fsStat.isFile()).toBeTruthy();
// confirm content of the "final" file
const expectedContent = new Buffer('onetwothreefourfive', 'utf8');
var fileContents = await fsPromises.readFile(DESTFILE);
expect(fileContents).toEqual(expectedContent);
done();
}
catch (err) {
fail(err);
}
finally {
}
});
});
Tôi hi vọng nó giúp ích cho ai đó.