[英]For loop issue in MEAN node jS
我正在嘗試在循環k值等於users [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中的實用程序包,我建議將包async
用於基於回調的解決方案,或將bluebird
用於Promises。 兩者都有一個.map
函數,非常適合此用例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.