ES7使用await generator从一个Promise数组中获取结果

32

在给定一个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
}
结果是正确的,但我仍然需要使用 forEach 和 then 将已解决的 Promise 转换为结果。这对我来说似乎不太合适。是否有更简洁的方法?

“promises” 已经包含了已解决的值,不是吗?至少对我来说,let result = await* [Promise.resolve(1), Promise.resolve(2)]; 是这样做的。 - m90
是的,promises中的每个条目都包含一个[[PromiseValue]],但我不知道如何在没有forEachthen的情况下访问它们。 - Matt K
很有趣。我刚刚尝试使用babel转译上面的代码,它给了我正确的值。你用什么进行转译? - m90
1
我正在使用Babel 6。你是说 promises 返回结果而不是Promise? - Matt K
在 https://phabricator.babeljs.io/T6866 创建了问题。感谢您的检查! - Matt K
显示剩余7条评论
3个回答

48

正如你提交的问题所提到的,核心问题在于await*已经不再存在并已被删除。不幸的是,在Babel 6中它没有正确地抛出语法错误,实际上被视为普通的await

你需要明确指出

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

哦,听说它不会继续推进,感到很抱歉,但感谢你让我知道!如果方便的话,你能否给我指一下在 esdiscuss 或被拒绝的其他地方链接吗?(由于没有引擎可以索引 await*,这个特定内容很难搜索) - Matt K
2
规范总是最好的查找位置。建议的规范语法在 https://github.com/tc39/ecmascript-asyncawait/blob/master/spec/syntax.html 中定义,仅定义了 await UnaryExpression - loganfsmyth
你可能想要查看bluebird的Promise.each方法,以使这段代码更具表现力。http://bluebirdjs.com/docs/api/promise.each.html即使使用ES7 async await,仍然有使用辅助库如Bluebird的好理由。 - Filip Sobczak

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接