首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点JS异步/等待与多个fs.writeFile使用through2 (Gulp/Vinyl)

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

Stack Overflow用户
提问于 2018-07-09 12:25:08
回答 1查看 1.3K关注 0票数 0

我使用through2从一个Gulp流生成多个文件。我使用的是NodeJS 10.6.0,所以我认为我应该充分利用异步/等待,但还没有完全理解这个机制。目前,through2 done()回调是在编写所有文件之前触发的。

下面是我所做的(简化)--注意,我不会在结束时返回流,因为没有必要返回。

代码语言:javascript
复制
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之后调用它,一切都如预期的那样工作,但我知道这是不正确的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-09 12:31:15

在调用doGenerateVariant之前,您需要等待done完成它的工作。记住,async函数总是返回一个承诺。这样你就可以这样做了

代码语言:javascript
复制
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

代码语言:javascript
复制
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();
    });
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51245563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档