2016-12-26 46 views
1

打字稿異步等待不適用於當前處理NODE js FS的senario。打字稿異步等待不能與FS工作

代碼如下。

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

我已經添加了的await在foreach,但循環繼續,我不循環迭代之前得到的值,而是給出在最後所有的值。

注: 我可以承諾添加到存在於循環,但問題是,它要求每一次無論是文件存在與否,如果該文件不存在,它會嘗試所有的對象多次創建相同的目錄或調用每個時間文件。

我想要它應該檢查文件一次,沒有找到,它應該創建目錄,然後目錄的存在將是真實的,所以它停止創建相同的目錄多muyltiple時間。

+5

'await fs.accessSync(filePath,fs.F_OK);'根本沒有意義。顧名思義,'fs.accessSync'是一個同步函數。 –

+2

避免['Promise' constructor antipattern](http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)! – Bergi

+3

此外,你應該[永遠不會傳遞'異步函數'到'Promise'構造函數](http://stackoverflow.com/a/39409757/1048572)和['forEach'不能與'async函數一起使用]( http://stackoverflow.com/q/37576685/1048572) – Bergi

回答

0

您需要正確的promisify異步文件系統的方法,所以你不能使用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; 
    }); 
} 
+0

createDirectory seond一會返回一個承諾與mkdir或將返回從當時的部分? –

+0

它會返回'mkdir'承諾後發生的'then'部分的承諾。當它創建一個目錄時它會用'true'來實現,當路徑已經存在時用'false'來實現,並且在發生錯誤時拒絕。 – Bergi