29

给定一系列承诺,在 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
}

结果是正确的,但我仍在做 aforEach和 athen将已解决的承诺转化为结果。这对我来说似乎不正确。有没有更清洁的方法?

4

3 回答 3

44

正如您提交的问题中所述,核心问题是await*不再是一个东西并且已被删除。不幸的是,它在 Babel 6 中没有正确抛出语法错误,并且基本上被视为正常的await.

您需要明确

 let [p1, p2] = await Promise.all([
          System.import('./package1.js'), System.import('./package2.js')]);
于 2015-12-20T18:29:42.887 回答
1

我不敢相信它真的有效,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);
}
于 2015-12-20T23:19:22.307 回答
0

一种方法来做到这一点......

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));
}
于 2018-04-15T00:10:05.887 回答