【问题标题】:Typescript async await not working with the FS打字稿异步等待不适用于FS
【发布时间】:2017-05-11 00:24:50
【问题描述】:

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 的值,而是在最后给出了所有值。

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

我希望它应该检查一次文件但没有找到,它应该创建目录,然后目录存在将是真实的,因此它将停止多次创建同一个目录。

【问题讨论】:

标签: javascript node.js asynchronous typescript


【解决方案1】:

你需要正确地promisify一个异步文件系统方法,所以你不能使用accessSyncmkdirSync(或者你可以使用它们,但是然后promise和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;
    });
}

【讨论】:

  • createDirectory 第二个会返回一个带有 mkdir 的承诺,还是会从 then 部分返回?
  • 它将从then 部分返回一个在mkdir 承诺之后发生的承诺。它会在创建目录时使用true,在路径已经存在时使用false,并在发生错误时拒绝。
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 2018-05-03
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多