使用through2(Gulp / Vinyl)与多个fs.writeFile进行节点JS异步/等待

时间:2018-07-09 12:25:09

标签: javascript node.js gulp async-await through2

我正在使用through2从Gulp流中生成多个文件。我正在使用NodeJS 10.6.0,因此以为我会充分利用async / await,但尚未完全了解其机制。当前,在写入所有文件之前,将触发through2 this.store回调。

这是我(简化)的内容-请注意,由于不需要,我不会在最后返回流。

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之后调用它,一切都会按预期进行,但我知道这是不正确的。

1 个答案:

答案 0 :(得分:1)

在致电doGenerateVariant之前,您需要等待done完成其工作。请记住,async函数始终会返回一个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();
    });
};