我有一个对象,该对象带有一系列我要执行的命名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;
为什么会这样?如何构造报告对象并解决此错误? 任何帮助/指针将不胜感激。
答案 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;
或者,如果可以并行运行查询,请改用map
和Promise.all
,然后再次await
返回结果:
await Promise.all(Object.entries(sqlqueries).map(async ([queryName, queryTpl]) => {
const querystr = replVars(queryTpl, vars);
report[queryName] = await query(querystr);
}));
return report;