У меня следующий пример в express js и пн goose. Существуют отношения между студентом и провинцией:
app.get('/example', async (req, res) => {
const provinces = await Province.find();
let studentsByProvince = [];
for (let prov of provinces) {
const st = await Student.count({ province: prov });
studentsByProvince.push({ province: prov.province, totalStudents: st });
}
res.json(studentsByProvince);});
Это неэффективно, поскольку внутри цикла поиск выполняется последовательно. Я решаю это следующим образом:
app.get('/example2', async (req, res) => {
const provinces = await Province.find();
let studentsByProvince = [];
let studentsByProvincePromises = [];
for (let prov of provinces) {
const studentPromise = Student.count({ province: prov });
studentsByProvincePromises.push(studentPromise);
}
const studentsByProvinceResult = await Promise.all(studentsByProvincePromises);
for (let [index, prov] of provinces.entries()) {
studentsByProvince.push({ province: prov.province, totalStudents: studentsByProvinceResult[index] });
}
res.json(studentsByProvince);});
Я уже решил проблему его параллельного выполнения, однако мне приходится go проходить через цикл дважды, поскольку запрос возвращает обещание, а не результат. Существует асин c, ждите какой-нибудь способ решить этот пример, аналогичный первому, но параллельно.