为什么我在等待时在forEach中收到SyntaxError:意外标识符?

时间:2018-11-22 09:06:38

标签: javascript promise async-await

我有一个对象,该对象带有一系列我要执行的命名SQL查询模板。

query()方法是异步的,因此我应该能够在等待状态下运行它,但是会收到意外的标识符错误。如果我离开等待状态,那么我不会出错,但是我被Promise对象困住了。

Object.entries(sqlquerries).forEach(([queryName, queryTpl]) => {
    try {
        const querystr = replVars(queryTpl, vars);
        report[queryName] = await query(querystr);
    } catch (err) {
        console.error('An error occured running the query : ', err );
    }
});
return report;

为什么会这样?如何构造报告对象并解决此错误? 任何帮助/指针将不胜感激。

1 个答案:

答案 0 :(得分:4)

由于await回调中出现的函数forEach不是async函数。如果您做到了这一点,请注意forEach不会对回调的返回值起作用,如果它是async函数,这将是一个保证,因此您必须确保以内联方式处理错误(在做)。

但是,您的return report建议您等待此过程完成。请注意,forEach等待上一个迭代的承诺解决,然后再进行下一个迭代。如果要执行此操作,请改为使用Promise reduce技巧,然后使用await结果(我想这全在async函数中):

await Object.entries(sqlqueries).reduce((p, [queryName, queryTpl]) => {
    const querystr = replVars(queryTpl, vars);
    return p.then(async() => {
        report[queryName] = await query(querystr);
    });
}, Promise.resolve());
return report;

或者,如果可以并行运行查询,请改用mapPromise.all,然后再次await返回结果:

await Promise.all(Object.entries(sqlqueries).map(async ([queryName, queryTpl]) => {
    const querystr = replVars(queryTpl, vars);
    report[queryName] = await query(querystr);
}));
return report;