Schema.find()是一个异步函数.因此,当您等待在循环中执行第一个作业搜索时,您的最后一行代码将会执行.我建议将其更改为Promises并使用Promise.all(array).
要做到这一点,首先你必须改为使用带有猫鼬的Promise.你可以用蓝鸟这样做:
var mongoose = require('mongoose'); mongoose.Promise = require('bluebird');
然后你可以使用Promises而不是像这样的回调:
userSchema.find({}).then(function(users) { var jobQueries = []; users.forEach(function(u) { jobQueries.push(jobSchema.find({u_sno:s.u.sno})); }); return Promise.all(jobQueries ); }).then(function(listOfJobs) { res.send(listOfJobs); }).catch(function(error) { res.status(500).send('one of the queries failed', error); });
编辑如何列出作业和用户
如果你想拥有一个像这样的结构:
[{ user: { /* user object */, jobs: [ /* jobs */ ] }]
你可以将列表合并在一起.listOfJobs与jobQueries列表的顺序相同,因此它们与用户的顺序相同.将用户保存到共享范围以访问"then函数"中的列表,然后合并.
.. }).then(function(listOfJobs) { var results = []; for (var i = 0; i < listOfJobs.length; i++) { results.push({ user: users[i], jobs: listOfJobs[i] }); } res.send(results); }).catch(function(error) { res.status(500).send('one of the queries failed', error); });