2015-12-20 14 views
18

Angesichts einer Reihe von Versprechungen, was ist der idiomatische Weg, um die Ergebnisse in ES7 zu erhalten?ES7 Erhalten eines Ergebnisses aus einer Reihe von Versprechungen mit Hilfe des Erwartungsgenerators

Hier ist, was ich tun möchte:

async function getImports() { 
    let imports = [System.import('./package1.js'), System.import('./package2.js')]; 
    let promises = await* imports; 
    let results = []; 
    await promises.forEach(val => val.then(data => results.push(data))); //seems hacky 
    console.log(results); // array of 2 resolved imports 
} 

Das Ergebnis ist richtig, aber ich mache noch einen forEach und then die aufgelösten Versprechen in Ergebnisse zu verwandeln. Das scheint mir nicht richtig zu sein. Gibt es einen saubereren Weg?

+0

Hat bereits die aufgelösten Werte nicht 'promises' suchen enthalten? Zumindest ist das "let result = erwarten" [Promise.resolve (1), Promise.resolve (2)]; tut es für mich? – m90

+0

Ja, jeder Eintrag in 'verspricht' enthält einen' [[PromiseValue]] '', aber ich weiß nicht wie ich auf sie zugreifen kann ohne die 'forEach' und' then' –

+0

Das ist interessant. Ich habe gerade versucht, das obige von babel transpiliert und es gab mir die richtigen Werte. Was verwendest du zum transpilieren? – m90

Antwort

26

Wie in der Ausgabe erwähnt, die Sie eingereicht haben, ist das Kernproblem, dass await* ist nicht mehr ein Ding und wurde entfernt. Leider hat es in Babel 6 keinen Syntaxfehler verursacht und wurde im Wesentlichen wie ein normaler await behandelt.

Sie müssen explizit

let [p1, p2] = await Promise.all([ 
      System.import('./package1.js'), System.import('./package2.js')]); 
+0

oh man, tut mir leid, es wird nicht vorwärts gehen, aber Danke, dass du es mich wissen lässt! Wenn Sie es griffbereit haben, könnten Sie mich auf einen Link auf esdiscuss verweisen oder wo immer es abgelehnt wurde? (Diese besondere Sache ist schwer zu suchen, da keine Motorindizes 'erwarten *') –

+2

Die Spezifikation ist immer der beste Ort, um zu sehen. Die vorgeschlagene Spezialsyntax ist in https://github.com/tc39/ecmascript-asyncawait/blob/master/spec/syntax.html und definiert nur 'erwarten UnaryExpression'. – loganfsmyth

+0

Sie können sich die Promise.each-Methode von bluebird ansehen, um diesen Code aussagekräftiger zu machen http://bluebirdjs.com/docs/api/promise.each.html Es gibt immer noch gute Gründe, Helper-Bibliotheken wie Bluebird zu verwenden mit ES7 async warten –

1

Ich kann es funktioniert nicht wirklich glauben, forEach zurückkehrt undefined die man nicht await. Wenn Sie eine Schleife benötigen, verwenden Sie map, um eine Reihe von (versprochenen) Ergebnissen zu erhalten.

In Ihrem Fall scheinen Sie für eine einfache

async function getImports() { 
    let promises = [System.import('./package1.js'), System.import('./package2.js')]; 
    let results = await Promise.all(promises) 
    console.log(results); 
}