2017-09-11 77 views
3

根据这篇文章:https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8等待Promises.all的SyntaxError

看起来这可能是可以使用下面的语法:

let [foo, bar] = await Promise.all([getFoo(), getBar()]); 

多个承诺执行。但使用它时,我得到Uncaught SyntaxError: Unexpected identifier

我该如何使用async/awaitpromise.all来实现多个同时执行的操作和一个响应的解决方案。

----- EDITED

我使用内部promise.all功能是这一个:

async function getJson(callback) { 
    try { 
     let response = await fetch('URL_LINK_HERE'); 
     let json = await response.json(); 
     return json; 
    } catch(e) { 
     console.log('Error!', e); 
    } 
} 

的测试场,我使用谷歌Chrome浏览器版本60.0.3112.113

+4

你使用的是什么JS引擎?它支持“await”吗? – Quentin

+0

尝试存储通过调用返回'Promise.all(...)'然后'等待返回的东西,而不是将它凝结成一条线。我有关于复杂指令的奇怪结果。这就好像编译器不知道我有时想要等待什么。我会看看我能否找到一个具体的例子。 – zero298

+0

它适用于Chrome Canary v63中的我 – Dez

回答

4

最有可能的代码看起来像这样:

var thingsDone = await Promise.all([ 
 
    Promise.resolve("eat"), 
 
    Promise.resolve("sleep") 
 
]); 
 
console.log(thingsDone);

这是行不通的,因为await关键字才有效的async功能(该功能在全球范围内是不)内。它只会导致语法错误。处理这种

一种方法是使用它像一个普通的旧承诺,不使用await关键字:

Promise.all([ 
 
    Promise.resolve("eat"), 
 
    Promise.resolve("sleep") 
 
]).then((thingsDone) => console.log(thingsDone));

或者,如果你想获得幻想(或需要更多的空间写一个富有表现力的功能),把你的逻辑包装在一个async函数中,然后像承诺一样处理它:

async function doThings() { 
 
    var eat = await Promise.resolve("eat"); 
 
    var sleep = await Promise.resolve("sleep"); 
 
    return Promise.all([Promise.resolve(eat), Promise.resolve(sleep)]); 
 
} 
 

 
doThings().then((thingsDone) => console.log(thingsDone));

这将允许您使用await根据需要和更加有用的更复杂的功能。

甚至更​​简洁地使用立即执行的async功能:

(async() => { 
 
    var eat = await Promise.resolve("eat"); 
 
    var sleep = await Promise.resolve("sleep"); 
 
    return Promise.all([Promise.resolve(eat), Promise.resolve(sleep)]); 
 
})().then((thingsDone) => console.log(thingsDone));

+0

发布此答案是为了更好地说明OP的评论链中讨论过的内容。在OP给出有关使用Promise.all的上下文的更多细节之前,可能实际上并不是答案。 –

+0

你说的是“正确的方式”,但立即执行的异步函数与“正确的”一样(如果实际上是OP的问题)。 –

+0

“即时执行异步功能”是什么意思? –

-1

torazaburo向我指出正确的方向在他的意见,我想通了,这是最后的代码,正在工作:

var getJson = async function() { 
    try { 
     let response = await fetch('http://mysafeinfo.com/api/data?list=englishmonarchs&format=json'); 
     let json = await response.json(); 
     return json; 
    } catch(e) { 
     console.log('Error!', e); 
    } 
} 

var check_all = async function(callback) { 
    callback([foo, bar] = await Promise.all([getJson(), getJson()])); 
}; 

check_all(function(data) { 
    console.log(data); 
}); 

这个作品,例子在这里:https://jsfiddle.net/01z0kdae/1/