ну, async
функция возвращает Promise
, это как они работают под капотом. Если бы не было .map
, вы могли бы просто await
использовать эту функцию или использовать ее как произвольно Promise
с .then()
и .catch
. Но поскольку существует массив Promise
, вам нужно Promise.all
, чтобы дождаться разрешения всех проблем.
const userEntriesDocs = await Promise.all(usersEntriesId.map(async id => {
....
);
Осторожно: в отличие от .allSettled
, .all()
немедленно потерпит неудачу, если произойдет сбой любого из следующих Promise
. Поэтому, если по какой-либо причине вы хотите получить данные из тех запросов, которые были выполнены успешно, вам нужны более сложные логики c.
В качестве альтернативы вы можете go - l oop вручную:
const userEntriesDocs = [];
for(const docPromise of userEntriesId.map(.....)) {
userEntriesDocs.push(await docPromise);
}
Но мне await Promise.all[...]
более читабельно.
Также я подчеркиваю, есть массив Обещаний (запросы уже отправлены). Если вы попытаетесь отправить запросы внутри l oop, например
const userEntriesDocs = [];
for(const id of userEntriesId) {
userEntriesDocs.push(await db
.collection("entries")
.doc(id)
.get()
.then(entry => {
return entry.data();
})
);
}
, вы обнаружите, что запросы выполняются строго один за другим, а не параллельно. Это потребует гораздо больше времени для обработки списка.