javascript - Node 上的文件创建问题

标签 javascript node.js

我在使用 Node 生成文件时遇到问题。这些文件显示的顺序不正确,并且在创建它们的循环完成后,我的自动 git 提交出现了异常。有人能帮助我吗! github 仓库:https://github.com/wendellmva/cli3

class Generator {
    constructor(){
        this.root = resolve(__dirname, 'generated');
    }   

    clean(done){
        if(fs.existsSync(this.root)){
            trash(this.root).then(done);
        } else {
            done();
        }
    }

    execute(){
        this.init()
        for(let i=0; i<10; ++i) {
            const file = resolve(this.root, `file${i}.txt`);
            fs.writeFile(file, 'Hello world', (err)=> {
                if(err) console.error(err);
                console.info('CREATE ', file);
                if(fs.existsSync(file)) this.add(file);
                if(i==9) this.commit();
            });
        }

    }

    init(){
        shelljs.exec(`mkdir ${this.root} && cd ${this.root} && git init`);
    }
    add(file){
        shelljs.exec(`cd ${this.root} && git add ${file}`);
    }
    commit(){
        shelljs.exec(`cd ${this.root} && git commit -m "chore: initial commit"`);
    }
}

const generator = new Generator();

generator.clean(()=>{
    generator.execute();
});

问题 1:提交在执行完成之前开始 导致空提交

问题 2:当生成的文件存在时,执行在 clean 完成之前开始 导致文件已存在错误 ===>已解决

问题 3:文件创建顺序不正确

Initialized empty Git repository in D:/@cardstrip/cli3/generated/.git/
CREATE  D:\@cardstrip\cli3\generated\file2.txt
CREATE  D:\@cardstrip\cli3\generated\file3.txt
CREATE  D:\@cardstrip\cli3\generated\file0.txt
CREATE  D:\@cardstrip\cli3\generated\file1.txt
CREATE  D:\@cardstrip\cli3\generated\file4.txt
CREATE  D:\@cardstrip\cli3\generated\file5.txt
CREATE  D:\@cardstrip\cli3\generated\file7.txt
CREATE  D:\@cardstrip\cli3\generated\file9.txt
[master (root-commit) 3442284] chore: initial commit
8 files changed, 8 insertions(+)
create mode 100644 file0.txt
create mode 100644 file1.txt
create mode 100644 file2.txt
create mode 100644 file3.txt
create mode 100644 file4.txt
create mode 100644 file5.txt
create mode 100644 file7.txt
create mode 100644 file9.txt
CREATE  D:\@cardstrip\cli3\generated\file6.txt
CREATE  D:\@cardstrip\cli3\generated\file8.txt

最佳答案

fs.writeFilechild_process.exec 都是异步的,您不会等到操作结束,这就是为什么您的代码没有执行您期望的操作要做的事。

我们可以使用 util.promisifywriteFileexec 转换为基于 Promise 的 API,并使用 async/await > 以正确的顺序执行操作。

const { promisify } = require('util');
const childProcess = require('child_process');
const fs = require('fs');

const writeFile = promisify(fs.readFile);
const exec = promisify(childProcess.exec);


class Generator {
    constructor(){
        this.root = resolve(__dirname, 'generated');
    }   

    async execute() {
        await this.init();

        for(let i=0; i < 10; ++i) {
            const file = resolve(this.root, `file${i}.txt`);

            await writeFile(file, 'Hello world');

            // No need to check if it exists, if it wasn't created writeFile rejects            
            console.info('CREATE ', file);

            await this.add(file);

        }

        return this.commit();
    }

    init(){
        return exec(`mkdir ${this.root} && cd ${this.root} && git init`);
    }

    add(file){
        return exec(`cd ${this.root} && git add ${file}`);
    }

    commit(){
        return exec(`cd ${this.root} && git commit -m "chore: initial commit"`);
    }
}

现在做的时候:

new Generator()
   .execute()
   .then(() => console.log('Commited!')
   .catch(err => console.error(err));

您将按顺序创建和添加文件,然后提交更改。

关于javascript - Node 上的文件创建问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50510813/

相关文章:

javascript - 访问名称中带有空格的 JSON 对象数据

javascript - Zurb Foundation 的样式自动完成

javascript - 当部分到达页面顶部时动态添加类

mysql - 你如何在 Node.js 中模拟 MySQL(没有 ORM)?

javascript - 类型错误 : Cannot set property 'xxx' of undefined

javascript - php根据html切换开关显示数据库中的数据

javascript - 在 AngularJS 中使用 $routeProvider 将 Controller 分配给表单模板

javascript - 使用 Google Sheets API (v4) 格式化单元格

javascript - 使用 React 和 Ant Design 的 float 标签

javascript - 从函数中取出信息