Javascript ES7使用等待生成器从一系列承诺中获取结果
给定一系列承诺,ES7中获得结果的惯用方法是什么 以下是我想做的:Javascript ES7使用等待生成器从一系列承诺中获取结果,javascript,ecmascript-6,ecmascript-harmony,ecmascript-2016,Javascript,Ecmascript 6,Ecmascript Harmony,Ecmascript 2016,给定一系列承诺,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 =&
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
来将已解决的承诺转化为结果。这对我来说就是不对。有没有更干净的方法 正如您提交的问题中提到的,核心问题是await*
不再是一件事,已被删除。不幸的是,它没有在Babel 6中正确地抛出语法错误,并且基本上被当作正常的wait
您需要明确地
let [p1, p2] = await Promise.all([
System.import('./package1.js'), System.import('./package2.js')]);
我不敢相信它真的有效,
forEach
确实返回了undefined
,您不能wait
。如果需要循环,请使用map
获得一组(承诺的)结果
就你而言,你似乎在寻找一个简单的
async function getImports() {
let promises = [System.import('./package1.js'), System.import('./package2.js')];
let results = await Promise.all(promises)
console.log(results);
}
一种方法是
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));
}
承诺
是否已包含已解析的值?至少这就是让结果=等待*[Promise.resolve(1),Promise.resolve(2)]对我有帮助吗?是的,中的每个条目都包含一个[[PromiseValue]]
,但是如果没有forEach
和then
,我不知道如何访问它们,这很有趣。我刚刚试着用巴贝尔传输上面的内容,它给了我正确的值。你用什么来传送?我用的是巴别塔6。你是说promissions
返回结果&而不是promissions?async/await
的关键是不再手动使用promissions。它隐藏在异步函数后面,正在等待异步函数。哦,伙计,很抱歉听到它不会向前发展,但谢谢你让我知道!如果你手边有它,你能给我指一个关于ESDiscussion的链接吗?或者它曾在哪里被拒绝过?(这个特殊的东西很难搜索,因为没有引擎索引await*
)规范总是最好的地方。建议的规范语法在中,仅定义了await-UnaryExpression
。您可能想看看Promise。bluebird的每一种方法都可以使此代码更具表达力,即使使用ES7 async-await,也有很好的理由使用bluebird这样的帮助程序库