web-dev-qa-db-fra.com

ES7 Obtenir le résultat d'un éventail de promesses en utilisant le générateur d'attente

Compte tenu des nombreuses promesses, quelle est la manière idiomatique d’obtenir les résultats dans ES7?

Voici ce que je veux faire: 

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
}

Le résultat est correct, mais je fais toujours une forEach et une then pour transformer les promesses résolues en résultats. Cela ne me semble pas juste. Y a-t-il un moyen plus propre? 

24
Matt K

Comme mentionné dans le numéro que vous avez déposé, le problème principal est que await* n'est plus une chose et a été supprimé. Malheureusement, une erreur de syntaxe n'a pas été correctement générée dans Babel 6 et a été traitée comme une variable normale await.

Vous aurez besoin de explicitement

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

Je ne peux pas croire que cela fonctionne réellement, forEach renvoie undefined qui ne peut pas await. Si vous avez besoin d'une boucle, utilisez map pour obtenir un tableau de résultats (promis).

Dans votre cas, vous semblez chercher un simple

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

Une façon de faire ça ....

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