javascript - Node JS async/await 与多个 fs.writeFile 使用 through2 (Gulp/Vinyl)

标签 javascript node.js gulp async-await through2

我正在使用through2从 Gulp 流生成多个文件。我正在使用 NodeJS 10.6.0,所以我想我会充分利用 async/await,但我还没有完全理解其机制。目前,在写入所有文件之前,会触发 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 之后调用它,一切都会按预期工作,但我知道这是不正确的。

最佳答案

在调用 done 之前,您需要等待 doGenerateVariant 完成其工作。请记住,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();
    });
};

关于javascript - Node JS async/await 与多个 fs.writeFile 使用 through2 (Gulp/Vinyl),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51245563/

相关文章:

node.js - 如何使用依赖于使用 Node.js 和 Mongoose 的另一个文档的动态变量来过滤文档?

javascript - 如何在 Node.js 服务器中包含 JavaScript 文件的函数?

javascript - 递归推送只添加最后一个元素

javascript - jquery 隐藏/显示来自 ul 的列表元素

node.js - 如何让 Node 服务器永久保持事件状态?

json - 来自 json 文件的 Gulp 循环

node.js - gulp 4版本问题导致所有任务失败

javascript - gulp-useref 与几个 html 文件以及如何获取包含在 Assets 中的文件列表

javascript - 滚动时添加文本阴影(jquery 或 javascript)

javascript - Lightbox2 不适用于图片库。在 VS code v.1.35 Kali linux 上工作