不使用Mongoose实现populate:数组赋值失效问题求解
问题原因及解决方法
为什么赋值不生效?
- forEach不支持异步等待:forEach会一次性启动所有异步回调,不会等每个
await Student.findById()执行完再推进流程。当你调用console.log(course.json())时,所有course.students[i] = s的赋值操作都还没完成,输出的自然还是原数组内容。 - 异步回调执行时机滞后:每个async回调里的赋值逻辑本身没问题,但这些回调的执行时间晚于后续的console.log语句,导致你看不到更新后的结果。
可行的解决办法
方法1:用for...of循环(顺序执行)
把forEach换成支持async/await的for循环,确保每一步异步操作完成后再进行下一次迭代:
async function populateStudents() { for (let i = 0; i < course.students.length; i++) { const s = await Student.findById(course.students[i]._id); course.students[i] = s; } console.log(course.json()); } populateStudents();
方法2:用Promise.all并行处理(效率更高)
如果不需要严格按顺序获取数据,用Promise.all批量发起请求,所有请求完成后再统一更新数组:
async function populateStudents() { course.students = await Promise.all( course.students.map(async item => await Student.findById(item._id)) ); console.log(course.json()); } populateStudents();
内容的提问来源于stack exchange,提问作者apcarry
相关产品推荐
相关产品推荐

