wake-up-neo.net

ES7 Das Ergebnis aus einer Reihe von Versprechen mit dem Wait-Generator abrufen

Wie lautet der idiomatische Weg, um mit ES7 eine Reihe von Versprechen zu erhalten?

Folgendes möchte ich tun: 

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 korrekt, aber ich mache immer noch eine forEach und eine then, um die gelösten Versprechen in Ergebnisse umzuwandeln. Das scheint mir einfach nicht richtig zu sein. Gibt es einen saubereren Weg? 

24
Matt K

Wie in dem von Ihnen eingereichten Problem erwähnt, besteht das Kernproblem darin, dass await* keine Sache mehr ist und entfernt wurde. Leider hat es in Babel 6 keinen Syntaxfehler gegeben und wurde im Wesentlichen wie ein normales await behandelt.

Sie müssen explizit

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

Ich kann nicht glauben, dass es tatsächlich funktioniert, forEach gibt undefined zurück, die Sie nicht await können. Wenn Sie eine Schleife benötigen, verwenden Sie map, um ein Array von (versprochenen) Ergebnissen zu erhalten.

In Ihrem Fall scheinen Sie nach einem einfachen zu suchen

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

Eine Möglichkeit, dies zu tun ....

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