【发布时间】:2020-02-28 03:54:59
【问题描述】:
我在 express js 和 mongoose 中有下一个示例。学生和省之间存在关系:
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);});
我已经解决了并行执行它的问题,但是我必须经历两次循环,因为查询返回的是一个承诺而不是结果。有 async await 某种方式来解决这个例子,类似于第一种方式,但是是并行的。
【问题讨论】:
-
经历两次有什么问题?开销将非常低。你的意思是
concurrently吗?我在这里看不到任何并行性。 Promise 通过分时 afaik 执行。 -
“圈内”是什么意思?
-
@Pointy 我认为他的意思是“循环”。至少这是我从帖子中了解到的
标签: javascript node.js promise async-await