2016-07-07 10 views
5

私はasync/awaitを使用したい次のTypescriptを持っています。しかし、私はそれを私の頭の中でどのように並べ替えることができないようです。どうすればonload promiseをAsync/Awaitに変換できますか

private getWorkbookFromFile2(excelFile: File): Promise<xlsx.IWorkBook> { 
    var loadedPromise = new Promise<xlsx.IWorkBook>((resolve, reject) => { 
     var reader = new FileReader(); 

     reader.onload = (event: any) => { 
      var data = event.target.result; 

      var workbook = xlsx.read(data, { type: 'binary' }); 

      console.log(workbook.SheetNames); 
      resolve(workbook); 
     }; 
     reader.readAsBinaryString(excelFile); 
    }); 

    return loadedPromise; 
} 

誰かがこの活字体の約束がasync/await

+0

https://www.typescriptlang.org/docs/release-notes/typescript-1.7.html –

答えて

12

活字体は今、例えば、ES6ジェネレータをネイティブでサポートしていエンジンのための非同期機能をサポートして使用するように変換することができますどのように私を見ることができますノードv4以上。非同期関数の先頭には、asyncキーワードが付いています。 awaitは、非同期関数の戻り値promiseが満たされ、返されたPromiseから値をアンラップするまで、実行を中断します。 - Source

async function getWorkbookFromFile2(excelFile: File) { 
    return new Promise<xlsx.IWorkBook>((resolve, reject) => { 
     var reader = new FileReader(); 

     reader.onload = (event: any) => { 
      var data = event.target.result; 

      var workbook = xlsx.read(data, { type: 'binary' }); 

      console.log(workbook.SheetNames); 
      resolve(workbook); 
     }; 
     reader.readAsBinaryString(excelFile); 
    }); 
} 

例消費:

async function caller() { 
    var workbook = await this.getWorkbookFromFile2(this.getFile()); 
    // The 'workbook' variable is an IWorkBook... 
} 
+0

待つ使用する方法はありませんので読者と 'onload'には? – Vaccano

+1

いいえ、あなたの非同期操作の最低レベルである必要はありません。 'onload'が' resolve'を呼び出すと、この関数から戻ることが約束されています。それは理にかなっていますか?基本的に言いたいことは、フードチェーンの上位にあるすべての定型コードを削除することです。この機能の呼び出し元は、従来の連鎖APIを使用するのではなく、単純に「待つ」ことができます。 –

+0

@DavidPineは、この関数をより完全な例にするために 'await'でどのように使用できるかの例を示していますか? –

関連する問題