我创建了一个承诺,当async.eachSeries将完成其任务时返回结果,当数组具有四个元素时,它在最终响应中仅显示一个元素。我想将数组中的所有元素显示为最终输出。下面是代码,这种方法正确吗?当我将console.log放在membersProcessed ++下面时,我也看到了它首先显示所有console.log,然后只发送一个输出。如何解决此问题,以在async.eachSeries完成后将所有数组发送回Promise。
var members = [];
let createMembers = new Promise((resolve, reject) => {
var membersProcessed = 0;
async.eachSeries(req.body.payLoad, (member, callback) => {
membersProcessed++;
User.find({mobileNumber: member.mobileNumber}, (err, data) => {
if(err) {
reject(err);
} else {
if (data.length == 0) {
member.isMember = true;
} else {
member.isMember = false;
}
members.push(member);
if(membersProcessed < req.body.payLoad.length) {
resolve(members);
} else {
callback();
}
}
});
});
});
createMembers.then((data) => {
res.status(200).send({
message: data
});
}).catch((err) => {
res.status(500).send({
message: err
});
});
当前输出
{
"message": [
{
"mobileNumber": "1234567891",
"firstName": "a",
"lastName": "aa",
"isMember": true
}
]
}
预期输出应为
{
"message": [
{
"mobileNumber": "1234567891",
"firstName": "a",
"lastName": "aa",
"isMember": true
},
{
"mobileNumber": "1234567892",
"firstName": "b",
"lastName": "bb",
"isMember": true
},
{
"mobileNumber": "1234567893",
"firstName": "c",
"lastName": "cc",
"isMember": false
}
]
}
答案 0 :(得分:0)
我看到您正在执行Users.find({mobileNumber:contact.mobileNumber}),这意味着您正在查询具有mobileNumber特定值的数据库,如果想要所有结果而不考虑过滤器,则直接执行
await Users.find({},(err,res)=>{
return res.send(JSON.stringify(res))
});
或者,如果您希望基于某些关键来获取记录,则
Users.find({mobileNumber:contact.mobileNumber},(err,result)=>{
return res.send(JSON.stringify(result))
});
结果将包含根据请求提出的所有对象的集合,您可以将其直接分配给另一个对象,例如
var obj=await Users.find({mobileNumber:contact.mobileNumber},(err,result)=>{
return res.send(JSON.stringify(result))
});
答案 1 :(得分:0)
在这种情况下,我认为您错误地使用了条件,您可以像这样更改条件。它工作正常。由于使用诺言,无论如何您的条件本身都会满足第一次迭代 if(membersProcessed
if(membersProcessed == req.body.payLoad.length) {
resolve(members);
} else {
callback();
}