我使用through2从一个Gulp流生成多个文件。我使用的是NodeJS 10.6.0,所以我认为我应该充分利用异步/等待,但还没有完全理解这个机制。目前,through2 done()回调是在编写所有文件之前触发的。
下面是我所做的(简化)--注意,我不会在结束时返回流,因为没有必要返回。
async function createDirectory(pathDir) {
return new Promise((resolve, reject) => {
mkdirp(pathDir, (err) => {
if (err) reject(err);
else resolve();
});
});
}
async function writeFile(outputFilePath, outputFileContent) {
return new Promise((resolve, reject) => {
fs.writeFile(outputFilePath, outputFileContent, (err) => {
if (err) reject(err);
else resolve();
});
});
}
async function doWriteFile(outputFolderPath, outputFilePath, outputContent) {
await createDirectory(outputFolderPath);
await writeFile(outputFilePath, outputContent, outputContent);
}
async function doGenerateVariant(data, variantArr) {
for (const variant of variantArr) {
/* Do a load of stuff */
const variantOutputFolderPath = blah;
const variantOutputFilePath = blah;
const variantOutputContent = blah;
await doWriteFile(variantOutputFolderPath, variantOutputFilePath, variantOutputContent);
}
}
const generateVariant = () => {
return through.obj((file, enc, done) => {
const data = JSON.parse(file.contents.toString());
*/ Do a load of stuff */
const { variant } = data;
const variantArr = Object.values(variant);
doGenerateVariant(data, variantArr);
return done();
});
};这不起作用,因为done()会在所有文件被写入之前返回。我猜我错过了一两次回报,但我做的一切似乎都没有用。
如果我将done()传递给doGenerateVariant,并在doWriteFile之后调用它,一切都如预期的那样工作,但我知道这是不正确的。
发布于 2018-07-09 12:31:15
在调用doGenerateVariant之前,您需要等待done完成它的工作。记住,async函数总是返回一个承诺。这样你就可以这样做了
const generateVariant = () => {
return through.obj((file, enc, done) => {
const data = JSON.parse(file.contents.toString());
*/ Do a load of stuff */
const { variant } = data;
const variantArr = Object.values(variant);
doGenerateVariant(data, variantArr).then(() => done());
});
};或者使用async/await
const generateVariant = () => {
return through.obj(async (file, enc, done) => {
const data = JSON.parse(file.contents.toString());
*/ Do a load of stuff */
const { variant } = data;
const variantArr = Object.values(variant);
await doGenerateVariant(data, variantArr);
done();
});
};https://stackoverflow.com/questions/51245563
复制相似问题