2015-12-20 4 views
18

約束事が与えられているとすれば、ES7で結果を得るための慣習的な方法は何ですか?ES7 awaitジェネレータを使用した約束事の結果を得る

は、ここで私が何をしたいです:

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 
} 

結果が正しいですが、私はまだ結果に分解約束をオンにするforEachthenをやっています。これはちょうど私には正しいように見えません。よりクリーンな方法がありますか?

+0

を探しているように見えますか?少なくともそれは「結果を待つ」というものです。[Promise.resolve(1)、Promise.resolve(2)];は私のためですか? – m90

+0

'promise'の各エントリには' [[PromiseValue]] 'が含まれていますが、' forEach'と 'then'を使わずにアクセスする方法はわかりません。 –

+0

それは面白いです。私はちょうど上記のバベルによって蒸して試してみて、それは私に正しい値を与えた。あなたは蒸散のために何を使用しますか? – m90

答えて

26

あなたが提出された問題で述べたように、問題の核心は、await*はもはやものであり、削除されたことではありません。残念ながら、Babel 6では構文エラーが正しくスローされず、基本的に通常のawaitのように扱われていました。

あなたはforEachが返さない、明示的

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

ああ、残念ですが、私に教えてくれてありがとう!それが便利なのであれば、私はesdiscussのリンクか、それが拒否された場所を指摘できますか? (この特定のことはエンジンインデックス 'await *'がないので検索が難しい) –

+2

specは常に見るのが最適な場所です。提案された仕様構文はhttps://github.com/tc39/ecmascript-asyncawait/blob/master/spec/syntax.htmlにあり、 'await UnaryExpression'だけを定義しています。 – loganfsmyth

+0

あなたは、このコードをより表現力豊かにするために、bluebirdのPromise.eachメソッドを見てみたいかもしれません。http://bluebirdjs.com/docs/api/promise.each.html Bluebirdのようなヘルパーライブラリを使う良い理由がありますES7非同期を待っている –

1

が、私はそれが実際に動作する信じることはできませんする必要がありますundefinedたあなたはawaitできません。ループが必要な場合は、mapを使用して(約束された)配列の配列を取得します。あなたのケースでは

、あなたは `promises`はすでに解決された値が含まれていないシンプルな

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