Почему я получаю SyntaxError: неожиданный идентификатор в forEach с await? - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть объект с серией именованных шаблонов запросов SQL, которые я пытаюсь выполнить.

Метод query () является асинхронным, поэтому я должен быть в состоянии запустить его с помощью await, но яполучить неожиданную ошибку идентификатора.Если я снимаю ожидание, то я не получаю сообщение об ошибке, но я застреваю с объектом Обещания ...

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 голосов
/ 22 ноября 2018

Поскольку функция await появляется (обратный вызов forEach) не является функцией async.Если вы делаете это одно, остерегайтесь того, что forEach ничего не делает с возвращаемым значением обратного вызова, что будет обещанием, если это функция async, и поэтому вы должны быть уверены, что обрабатывает встроенные ошибки (что вы делаете).

Но , ваш return report предполагает, что вы ожидаете завершения этого процесса.Помните, что forEach будет , а не дождаться выполнения обещания предыдущей итерации, прежде чем перейти к следующей.Если вы хотите сделать это, используйте вместо этого обещание 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;
...