2016-07-07 16 views
5

Tôi có các Loại bản ghi sau mà tôi muốn sử dụng async/await. Nhưng tôi dường như không thể phân loại nó trong đầu của tôi như thế nào để làm điều này.Làm cách nào để chuyển đổi lời hứa onload thành 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; 
} 

Có thể ai đó chỉ cho tôi cách hứa nguyên cảo này có thể được chuyển đổi sang sử dụng async/await

+0

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

Trả lời

12

nguyên cảo bây giờ hỗ trợ các chức năng không đồng bộ cho công cụ có hỗ trợ cho các máy phát điện ES6, ví dụ Nút v4 trở lên. Các hàm không đồng bộ được bắt đầu bằng từ khóa async; chờ đợi đình chỉ việc thực hiện cho đến khi một lời hứa trả về hàm không đồng bộ được thực hiện và unwraps giá trị từ Promise trả về. - tiêu thụ 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); 
    }); 
} 

Ví dụ:

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

Vì vậy, không có cách nào để sử dụng chờ đợi trên đầu đọc và 'onload'? – Vaccano

+1

Không, không cần phải vì đây là mức thấp nhất trong hoạt động không đồng bộ của bạn. Lời hứa là bạn sẽ trở về từ hàm này khi 'onload' gọi' resolve'. Điều đó có ý nghĩa? Về cơ bản, bạn loại bỏ tất cả mã boilerplate cao hơn chuỗi thức ăn để nói, như vậy người gọi hàm này có thể chỉ đơn giản là "chờ đợi" thay vì sử dụng API chuỗi kế thừa. –

+0

@DavidPine có thể cho thấy một ví dụ về cách chức năng này có thể được sử dụng với 'chờ đợi' để làm cho nó một ví dụ hoàn chỉnh hơn? –

Các vấn đề liên quan