我想使多个异步等待在foreach循环函数调用和按值返回到一个数组。但它返回一个承诺。我怎么可以存储在阵列中的实际返回的值?谢谢您的帮助。
let table1Assignments = [];
await groupingTable1Id.forEach(table1Id => {(
table1Assignments.push(assignmentsDAO.getAssignmentsOfTable(table1Id, date, time)))
});
getAssignmentsOfTable看起来是这样的:
async getAssignmentsOfTable(tableId, date = null) {
let stmt =
`SELECT *
FROM assignment a
WHERE a.dining_table_id = $1` + (date?' AND a.date = $2':'');
const params = date?[tableId, date]:[tableId];
const result = await this.db.query(stmt, params);
return result.rows.map(row => {
return new Assignment(
row.id,
row.dining_table_id,
row.guest_group_id,
row.date,
row.time
);
});
}
我会按照这种模式:
Promise.all([
groupingTable1Id.map(table1Id => assignmentsDAO.getAssignmentsOfTable(table1Id, date, time))
]).then((table1Assignments) => {
table1Assignments.forEach(assignment) { process(assignment) });
});
请参阅有关JavaScript(ES6)文档Promise.all here ...
您可以在一个大的承诺使用Promise.all将你的承诺。它看起来像这样
const promises = Promise.all(
// map your IDs to assignment promises
groupingTable1Id.map(table1Id => assignmentsDAO
.getAssignmentsOfTable(table1Id, date, time))
);
promises.then(table1Assignments => {
// Do stuff with assignments
table1Assignments.forEach(console.log);
});
相反forEach
的,你可以使用for of
循环,如下所示:
let table1Assignments = [];
for (const table1Id of groupingTable1Id) {
table1Assignments.push(await assignmentsDAO.getAssignmentsOfTable(...));
}
编辑:这是不是因为顺序执行相比Promise.all
的性能方面最快的解决方法,但我觉得它更清晰。