async.EachSeries无法正常工作

时间:2018-07-18 17:54:26

标签: node.js mongodb promise es6-promise async.js

我创建了一个承诺,当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
        }
    ]
}

2 个答案:

答案 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)

 if(membersProcessed == req.body.payLoad.length) {
    resolve(members);
 } else {
    callback();
 }