对于 MEAN 节点 jS 中的循环问题
For loop issue in MEAN node jS
我试图在循环k值等于用户[0]时发送响应。employees.length,但是它直接向前移动到最大长度,我如何解决它
Userlist.find(queryObj).exec(function (err, users) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
}
else {
console.log('found users list', users);
// res.json(users[0].employees);
var k=0;
var resparr=[]
for(var i=0;i<users[0].employees.length;i++){
k++;
User.find({"_id":users[0].employees[i]._id}).exec(function(err,user){
resparr=resparr.concat(user);
console.log("resparray:",k,resparr.length,i,users[0].employees.length)
if(k==users[0].employees.length)
{
console.log("success",resparr)
res.json(resparr);
}
})
}
}
});
您正在同步循环中使用异步函数调用。循环将始终在您的回调函数被调用之前结束。
您将需要某种异步循环。对于本机解决方案,您可以使用 Promises:
const getUser = (id) => {
return new Promise((resolve, reject) => {
User.find({ '_id': id })
.exec((err, user) => {
if (err) reject(err);
else resolve(user);
});
});
};
const promises = users[0].employees.map(({ _id: id }) => getUser(id));
Promise.all(promises)
.then(users => res.json(users))
.catch(err);
对于 node.js 中的实用程序包,我建议使用 Promises 包 async
for a callback based solution or bluebird
。两者都有一个非常适合此用例的 .map
函数。
我试图在循环k值等于用户[0]时发送响应。employees.length,但是它直接向前移动到最大长度,我如何解决它
Userlist.find(queryObj).exec(function (err, users) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
}
else {
console.log('found users list', users);
// res.json(users[0].employees);
var k=0;
var resparr=[]
for(var i=0;i<users[0].employees.length;i++){
k++;
User.find({"_id":users[0].employees[i]._id}).exec(function(err,user){
resparr=resparr.concat(user);
console.log("resparray:",k,resparr.length,i,users[0].employees.length)
if(k==users[0].employees.length)
{
console.log("success",resparr)
res.json(resparr);
}
})
}
}
});
您正在同步循环中使用异步函数调用。循环将始终在您的回调函数被调用之前结束。
您将需要某种异步循环。对于本机解决方案,您可以使用 Promises:
const getUser = (id) => {
return new Promise((resolve, reject) => {
User.find({ '_id': id })
.exec((err, user) => {
if (err) reject(err);
else resolve(user);
});
});
};
const promises = users[0].employees.map(({ _id: id }) => getUser(id));
Promise.all(promises)
.then(users => res.json(users))
.catch(err);
对于 node.js 中的实用程序包,我建议使用 Promises 包 async
for a callback based solution or bluebird
。两者都有一个非常适合此用例的 .map
函数。