Typescript异步等待着与FS一起工作



typescript async等待等待与当前与节点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中添加了等待的等待,但是循环仍在继续,我在循环迭代之前没有获得价值,而是给出了所有值。

注意:我可以向循环中存在的所有对象添加承诺,但问题是它每次都存在或不存在文件时都会调用,如果文件不存在,它会尝试多次创建相同的目录或每个文件存在时间文件。

我想要的是应该检查一次文件一次并且找不到的文件,它应该创建目录,之后目录存在将是正确的,因此它会停止创建相同的目录多个usyyltipter。

您需要正确地授权 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);
}

但是,请注意,使用fs.access在不建议采取操作之前检查。您应该只是发现错误:

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;
    });
}

最新更新