Когда вы делаете
return new Promise((resolve, reject) => {
let companyJobs = [];
db.collection("company").doc(user.selectedCompany).collection("jobs").get().then((jobs) => {
jobs.forEach((job) => {
loadJobLinkedServices(user, job).then((jobLinkedServices) => {
companyJobs.push({
id: job.id,
...
});
});
});
resolve(companyJobs);
}).catch(function (error) {
...
});
});
ничто не гарантирует, что ваше Обещание разрешается только после того, как ВСЕ запросы, запущенные в цикле jobs.forEach()
, выполнены (т. Е. Обещания, возвращаемые вызовами функции loadJobLinkedServices
, разрешены).
Я не знаю responsejs, но я думаю, что вы можете использовать метод JavaScript Promise.all()
в следующих строках:
return new Promise((resolve, reject) => {
let promises = [];
let companyJobs = [];
db.collection("company").doc(user.selectedCompany).collection("jobs").get().then((jobs) => {
jobs.forEach((job) => {
promises.push(loadJobLinkedServices(user, job));
});
Promise.all(promises).
then(results => {
//Loop over the results array to populate the companyJobs array
resolve(companyJobs);
})
}).catch(function (error) {
...
});
});
Кроме того, не забудьте правильно связать ваши вызовы с различными асинхронными функциями, например что-то вроде:
query Collection A
THEN query Collection B
THEN query all sub-collections (with Promise.all())
THEN query Collection C
THEN set Loading Status Inactive
Наконец, последнее замечание: обратите внимание, что метод get()
возвращает обещание, поэтому я не уверен, что вам нужно заключить вызовы метода get()
в какой-то новый Promises
(Опять же, я не разбираюсь в реакциях, поэтому это замечание может быть ошибочным).
Другими словами, я думаю, что вы могли бы сделать что-то вроде следующего (например, для функции loadJobLinkedServices
):
export function loadJobLinkedServices(user, job){
let jobLinkedServices = [];
return db.collection("company").doc(user.selectedCompany).collection("jobs").doc(job.id).collection("linkedServices").get()
.then((linkedServices) => {
linkedServices.forEach((linkedService) => {
jobLinkedServices.push({
id: linkedService.id,
...
});
});
return jobLinkedServices;
}).catch(function (error) {
...
});
})