2016-07-07 12 views
5

Ich habe die folgenden Typoskripte, die ich verwenden möchte async/await auf. Aber ich kann mir nicht vorstellen, wie das geht. Wie kann ich ein Onload-Versprechen in Async/Await konvertieren

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

Kann mir jemand zeigen, wie das Typoskript Versprechen async/await

+0

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

Antwort

12

Typoskript umgewandelt werden können jetzt unterstützt, die, zum Beispiel für ES6 nativen für Motoren Asynchron-Funktionen zu verwenden Generatoren Unterstützung haben Knoten v4 und höher. Asynchronen Funktionen wird das Schlüsselwort async vorangestellt. h award unterbricht die Ausführung, bis eine asynchrone Rückgabeversprechung der Funktion erfüllt ist, und entpackt den Wert aus dem zurückgegebenen Versprechen. - 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); 
    }); 
} 

Beispiel Verbrauch:

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

So gibt es keine Möglichkeit zu nutzen erwarten auf den Leser und das 'Onload'? – Vaccano

+1

Nein, dies ist nicht notwendig, da dies die niedrigste Stufe Ihres asynchronen Betriebs ist. Das Versprechen ist, dass Sie von dieser Funktion zurückkehren werden, wenn 'onload'' resolve' aufruft. Ist das sinnvoll? Sie entfernen sozusagen den Code der oberen Ebene der Lebensmittelkette, so dass Anrufer dieser Funktion einfach "warten" können, anstatt die alte Verkettungs-API zu verwenden. –

+0

@DavidPine kann vielleicht ein Beispiel zeigen, wie diese Funktion mit 'await' verwendet werden kann, um es zu einem vollständigeren Beispiel zu machen? –