节点 JS async/await 具有多个 fs.writeFile 使用 through2 (Gulp/Vinyl)
Node JS async/await with multiple fs.writeFile using through2 (Gulp/Vinyl)
我正在使用 through2 从 Gulp 流生成多个文件。我正在使用 NodeJS 10.6.0,所以我想我会充分利用 async/await,但我还没有完全理解其机制。当前,through2 done()
回调在所有文件写入之前被触发。
这是我所拥有的(简化版)- 请注意,我没有 return 结束流,因为没有必要。
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()
在所有文件被写入之前得到 returned。我猜我错过了一两个 return 但我所做的一切似乎都没有用。
如果我将 done()
传递给 doGenerateVariant
并在 doWriteFile
之后调用它,一切都会按预期进行,但我知道这是不正确的。
在调用 done
之前,您需要等待 doGenerateVariant
完成它的工作。记住 async
函数总是 returns 一个 Promise。所以你可以这样做
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();
});
};
我正在使用 through2 从 Gulp 流生成多个文件。我正在使用 NodeJS 10.6.0,所以我想我会充分利用 async/await,但我还没有完全理解其机制。当前,through2 done()
回调在所有文件写入之前被触发。
这是我所拥有的(简化版)- 请注意,我没有 return 结束流,因为没有必要。
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()
在所有文件被写入之前得到 returned。我猜我错过了一两个 return 但我所做的一切似乎都没有用。
如果我将 done()
传递给 doGenerateVariant
并在 doWriteFile
之后调用它,一切都会按预期进行,但我知道这是不正确的。
在调用 done
之前,您需要等待 doGenerateVariant
完成它的工作。记住 async
函数总是 returns 一个 Promise。所以你可以这样做
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();
});
};