Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ES7 Getting result from an array of promises using await generator

Given an array of promises, what's the idiomatic way to get the results in ES7?

Here's what I want to do:

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
}

The result is correct, but I'm still doing a forEach and a then to turn the resolved promises into results. This just doesn't seem right to me. Is there a cleaner way?

like image 437
Matt K Avatar asked Dec 20 '15 15:12

Matt K


2 Answers

As mentioned in the issue you filed, the core issue is that await* is no longer a thing and has been removed. Unfortunately, it was not properly throwing a syntax error in Babel 6 and was essentially being treated like a normal await.

You'll need to explicitly

 let [p1, p2] = await Promise.all([
          System.import('./package1.js'), System.import('./package2.js')]);
like image 181
loganfsmyth Avatar answered Nov 19 '22 15:11

loganfsmyth


I cannot believe it actually works, forEach does return undefined which you cannot await. If you need a loop, use map to get an array of (promised) results.

In your case, you seem to be looking for a simple

async function getImports() {
  let promises = [System.import('./package1.js'), System.import('./package2.js')];
  let results = await Promise.all(promises)
  console.log(results);
}
like image 29
Bergi Avatar answered Nov 19 '22 16:11

Bergi