ฉันสะดุดข้ามหน้านี้ในขณะที่พยายามแก้ไขปัญหาใน NodeJS: ประกอบชิ้นส่วนของไฟล์อีกครั้ง โดยทั่วไป: ฉันมีชื่อไฟล์มากมาย ฉันต้องผนวกไฟล์เหล่านั้นทั้งหมดตามลำดับที่ถูกต้องเพื่อสร้างไฟล์ขนาดใหญ่หนึ่งไฟล์ ฉันต้องทำแบบอะซิงโครนัส
โมดูล 'fs' ของโหนดให้ appendFileSync แต่ฉันไม่ต้องการบล็อกเซิร์ฟเวอร์ในระหว่างการดำเนินการนี้ ฉันต้องการใช้โมดูล fs.promises และหาวิธีเชื่อมโยงสิ่งนี้เข้าด้วยกัน ตัวอย่างในหน้านี้ไม่ได้ผลสำหรับฉันเพราะฉันต้องการการดำเนินการสองอย่าง: fsPromises.read () เพื่ออ่านในไฟล์อันและ fsPromises.appendFile () เพื่อเชื่อมต่อกับไฟล์ปลายทาง บางทีถ้าฉันดีขึ้นด้วย javascript ฉันอาจทำให้คำตอบก่อนหน้านี้ใช้ได้สำหรับฉัน ;-)
ฉันพบสิ่งนี้ ...
https://css-tricks.com/why-using-reduce-to-sequentially-resolve-promises-works/
... และฉันสามารถแฮ็คโซลูชันการทำงานร่วมกันได้
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());
};
และนี่คือการทดสอบหน่วยจัสมินสำหรับมัน:
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 {
}
});
});
ฉันหวังว่ามันจะช่วยให้ใครบางคน