2016-07-07 23 views
5

Ho il seguente dattiloscritto che vorrei usare async/await su. Ma non riesco a distinguermi in testa come farlo.Come posso convertire una promessa onload in 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; 
} 

Qualcuno mi può mostrare come questo tipografico promessa può essere convertito per utilizzare async/await

+0

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

risposta

12

dattiloscritto ora supporta le funzioni asincrone per i motori che hanno il supporto nativo per i generatori, per esempio ES6 Nodo v4 e successivi. Le funzioni asincrone sono precedute dalla parola chiave async; attende sospende l'esecuzione fino a quando non viene soddisfatta una promessa di ritorno alla funzione asincrona e scartina il valore dalla Promessa restituita. - Consumo 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); 
    }); 
} 

Esempio:

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

Quindi non v'è alcun modo per utilizzare attendono sul lettore e il 'onload'? – Vaccano

+1

No, non è necessario poiché questo è il livello più basso della tua operazione asincrona. La promessa è che tornerai da questa funzione quando "onload" invoca 'resolve'. Ha senso? Stai praticamente rimuovendo tutto il codice boilerplate più in alto nella catena alimentare per così dire, in modo tale che i chiamanti di questa funzione possano semplicemente "attendere" invece di usare l'API legacy chaining. –

+0

@DavidPine potrebbe mostrare un esempio di come questa funzione può essere utilizzata con 'await' per renderlo un esempio più completo? –

Problemi correlati