【问题标题】:ES7 Getting result from an array of promises using await generatorES7 使用 await 生成器从一系列 Promise 中获取结果
【发布时间】:2016-03-26 18:17:09
【问题描述】:

给定一系列 Promise,在 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 将已解决的承诺转化为结果。这对我来说似乎不正确。有没有更清洁的方法?

【问题讨论】:

  • promises 不是已经包含解析值了吗?至少那是let result = await* [Promise.resolve(1), Promise.resolve(2)]; 为我做的?
  • 是的,promises 中的每个条目都包含一个 [[PromiseValue]],但如果没有 forEachthen,我不知道如何访问它们
  • 这很有趣。我刚刚尝试了上面由 babel 转换的内容,它给了我正确的值。你用什么转译?
  • 我正在使用 babel 6。你是说 promises 返回结果而不是承诺?
  • async/await 的全部意义在于不再手动使用 Promise。它隐藏在异步函数和等待异步函数之后。

标签: javascript ecmascript-6 ecmascript-harmony ecmascript-2016


【解决方案1】:

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

你需要明确

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

【讨论】:

  • 哦,伙计,很遗憾听到它不会继续前进,但感谢您让我知道!如果你方便的话,你能指出我在 esdiscuss 上的链接或者它被拒绝的地方吗? (这个特别的东西很难搜索,因为没有引擎索引await*
  • 规范总是最好的地方。建议的规范语法在github.com/tc39/ecmascript-asyncawait/blob/master/spec/… 中,仅定义await UnaryExpression
  • 您可能想看看 bluebird 的 Promise.each 方法,以使这段代码更具表现力bluebirdjs.com/docs/api/promise.each.html 即使使用 ES7 异步等待,仍然有充分的理由使用 Bluebird 等帮助程序库
【解决方案2】:

这样做的一种方法....

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));
}

【讨论】:

    【解决方案3】:

    我不敢相信它真的有效,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);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-22
      • 2017-03-27
      • 2019-03-27
      • 2021-12-28
      • 2015-07-15
      • 2017-07-22
      • 2014-09-22
      • 2023-03-25
      • 2016-06-14
      相关资源
      最近更新 更多