async
функции всегда возвращают Promise, но .map
не «ожидает» этих обещаний (они просто помещают их «как есть» в результате). Если вы хотите получить все результаты, самый простой способ будет Promise.all
:
const venuesWithTeam = await Promise.all(venues.map(async (element) => ({
...element,
team: await connection('team')
.where('id', element.team_id)
.select('*')
.first(),
})));
Примечание: при этом все операции начнутся параллельно (одновременно) и будут ждать все они должны быть решены, прежде чем продолжить. Если venues
- это очень большой массив, это может привести к большому количеству соединений с вашей базой данных и потенциально вызвать некоторые проблемы.
Чтобы выполнять запросы один за другим, вам потребуется l oop и ждите, пока предыдущий будет решен. Один из способов сделать это можно сделать, используя reduce
.
const venuesWithTeam = await venues.reduce((prom, element) => (
prom.then(async result => (
result.concat({
...element,
team: await connection('team')
.where('id', element.team_id)
.select('*')
.first(),
})
))
), Promise.resolve([]));