Я создаю API для взаимодействия с моей базой данных Google Cloud Firestore.Я запрашиваю «конвейеры» в моем приложении.Запрос вернет массив конвейеров (т.е. массив объектов JSON).Каждый объект JSON имеет атрибут users , который равен массиву строк .Каждая строка представляет идентификатор пользователя в моей базе данных.
Что я пытаюсь сделать, так это сопоставить каждый конвейер и затем внутри каждой конвейерной карты массив пользователей, чтобы сделать асинхронный вызов моегобаза данных для извлечения информации для этого пользователя по его идентификатору пользователя.
У меня возникли проблемы с ожиданием завершения всех асинхронных запросов и правильного возврата данных.В настоящее время у меня есть следующий код:
pipelineResults.map(pipeline => {
pipeline.users = pipeline.users.map(user => {
return promises.push(db.collection('users')
.doc(user)
.get()
.then(snapshot => {
user = snapshot.data();
console.log(user);
return user;
}));
});
return pipeline;
});
Promise.all(promises)
.then(result => {
res.send(pipelineResults);
});
pipelineResults JSON определяется следующим образом (перед сопоставлением):
[
{
"integrations": [
{
"dateAdded": {
"_seconds": 1553435585,
"_nanoseconds": 769000000
},
"vendorId": "abcdefg",
"integrationId": "ahdhfyer",
"addedBy": "xEcscnBo0PGgOEwb2LGj",
"used": 1
}
],
"users": [
"xEcscnBo0PGgOEwb2LGj"
],
"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras nec augue dapibus, interdum felis ac, tristique nunc. Donec justo ex, pulvinar a nisl et, consequat porta nunc.",
"scheduled": {
"isScheduled": false
},
"orgId": "ae35gt654",
"runInfo": null,
"name": "Development pipeline",
"teams": [
{
"users": [
"xEcscnBo0PGgOEwb2LGj"
],
"createdOn": {
"_seconds": 1553435585,
"_nanoseconds": 769000000
},
"id": "abfe4h6uuy",
"createdBy": "xEcscnBo0PGgOEwb2LGj",
"userCount": 1
}
],
"createdOn": {
"_seconds": 1553435585,
"_nanoseconds": 769000000
},
"createdBy": "xEcscnBo0PGgOEwb2LGj"
}
]
После выполнения вышеуказанного кодаЧтобы отобразить конвейеры и пользователей, пользовательский атрибут в конвейере теперь представляет собой просто массив с 1 внутри:
"users": [
1
]
Пользовательский объект должен выглядеть следующим образом:
{ firstName: 'Alex',
activeIntegrations: 14,
position: 'Manager',
email: 'alex@alexwiley.co.uk',
lastName: 'Wiley',
}
Я почти уверен, что не возвращаюсь и не жду асинхронного вызова.
Сводка Выполнение асинхронного вызова внутри двух функций карты.
Любая помощь очень ценится.