web-dev-qa-db-ja.com

ES7 awaitジェネレーターを使用して一連のプロミスから結果を取得する

約束の配列を考えると、ES7で結果を得るための慣用的な方法は何ですか?

私がやりたいことは次のとおりです。

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をまだ実行しています。これは私には正しくないようです。よりクリーンな方法はありますか?

25
Matt K

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

明示的にする必要があります

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

forEachが実際に動作するとは信じられませんが、undefinedは返せないawaitを返します。ループが必要な場合は、mapを使用して、(約束された)結果の配列を取得します。

あなたの場合、あなたはシンプルなものを探しているようです

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

これを行う1つの方法....

async function abc() {
    let p1 = getReviews();
    let p2 = getMenu();
    let [reviews, menu] = await results(p1, p2);
}

function results(...rest) {
    return Promise.all(rest).catch(err => console.log(err));
}
0
Muhammad Umer