簡體   English   中英

節點上的文件創建問題

[英]File creation issues on node

我在用node生成文件時遇到問題。 這些文件不按順序顯示,並且在創建它們的循環完成后,將我的自動git commit丟掉了。 有人能幫助我嗎! 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:當生成的文件存在時,在清理完成之前開始執行,導致文件已經存在錯誤===>已解決

問題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));

您將按順序創建和添加文件,然后提交更改。

您正在循環中使用fs.writeFile的異步版本,這意味着您不知道將數據寫入磁盤的順序,並且該循環不會等待該異步函數的每次調用繼續。

您必須找到一種方法來知道何時寫入了最后一個文件。 要做到這一點的方法是使用的synnchronized版本fs.writeFile功能是fs.writeFileSync是這樣的:

execute(){
    this.init();

    for(let i=0; i<10; ++i) {
        const file = resolve(this.root, `file${i}.txt`);
        try {
            fs.writeFileSync(file, 'Hello world');
            console.info('CREATE ', file);

            if(fs.existsSync(file)) this.add(file);
        } catch (err) {
            console.error(err);
        }
    }
    this.commit();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM