等待Promises.all SyntaxError

时间:2017-09-11 15:37:52

标签: javascript async-await

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

似乎可以使用以下语法:

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

执行多个promises。但是在使用它时,我得到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);
    }
}

作为测试字段我正在使用谷歌浏览器版本60.0.3112.113

2 个答案:

答案 0 :(得分:5)

您的代码很可能看起来像这样:

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

答案 1 :(得分:-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/