首页 文章

Typescript async等待不使用FS

提问于
浏览
1

typescript async await不适用于处理NODE js FS的当前senario .

遵循代码 .

public static FileExists(filePath: string): Promise<boolean> {
        return new Promise<boolean>(async (resol, reje) => {
            try {
                fs.accessSync(filePath, fs.F_OK);
                resol(true);
            }
            catch (e) {
                resol(false);
            }
        });
    }

     public static async CreateDirectory(name: string): Promise<boolean> {
    return new Promise<boolean>(async (resolve, reject) => {
        let dirExist: boolean = await FileManager.FileExists(name);
        try {
            if (!dirExist) {
                fs.mkdirSync(name);
            }
            resolve(true);
        } catch (e) {
            resolve(false);
        }

    });

  for (var i = 0; i < paths.length; i++) {
                var element = paths[i];
                fullPath += element + "/";
                let a = await FileManager.CreateDirectory(fullPath);
                console.log(fullPath);
            }

我在foreach中添加了await但循环继续,我在循环迭代之前没有获得a的值,而是在结尾处给出所有值 .

Note: 我可以将承诺添加到循环中存在的所有对象,但问题是每当文件存在与否时调用它,如果文件不存在则尝试多次创建相同的目录或每个调用时间文件的时间 .

我想要它应该检查文件一次但没有找到,它应该创建目录,然后目录存在将是真的所以它woill停止创建相同的目录多个muyltiple次 .

1 回答

  • 0

    你需要正确promisify asynchronous 文件系统方法,所以你不能使用 accessSyncmkdirSync (或者你可以使用它们,但是然后承诺和 async 函数将毫无意义) .

    相反,做

    public static fileExists(filePath: string): Promise<boolean> {
        return new Promise<boolean>(async resolve => {
            fs.accessSync(filePath, fs.F_OK, err => {
                if (err) resolve(false);
                else resolve(true);
            });
        });
    }
    
    public static async createDirectory(name: string): Promise<boolean> {
        if (!await this.fileExists(name)) {
            await new Promise(async (resolve, reject) => {
                fs.mkdir(name, err => {
                    if (err) reject(err);
                    else resolve();
                });
            });
        }
        return true;
    }
    
    var fullPath = ""
    for (var element of paths)
        fullPath += element + "/";
        let a = await FileManager.createDirectory(fullPath);
        console.log(fullPath);
    }
    

    但请注意using fs.access to check before an action is not recommended . 您应该只是捕获错误:

    public static createDirectory(name: string): Promise<boolean> {
        return new Promise(async (resolve, reject) => {
            fs.mkdir(name, err => {
                if (err) reject(err);
                else resolve();
            });
        }).then(() => true, err => {
            if (err.code == "EEXIST") return false;
            else throw err;
        });
    }
    

相关问题