2016-07-07 592 views
5

我有以下打字稿,我想使用async/await。但我似乎无法在我的脑海中梳理出如何做到这一点。如何将onload承诺转换为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关键字为前缀;等待暂停执行,直到完成异步函数返回许诺并解开返回的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'来使这个函数成为一个更完整的例子? –