【问题标题】:async.EachSeries not working properlyasync.EachSeries 无法正常工作
【发布时间】:2018-12-26 17:47:42
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我看到您正在执行 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))
            });
    

    【讨论】:

    • 但问题在于异步,我无法处理所有数组。它只处理一个索引。例如,在我的有效负载中,我有四个对象,它只处理一个对象而不处理其他对象
    • @JN_newbie 我相信您应该在异步函数中使用 await 关键字,因为它们会链接输出直到异步函数完成执行,请参阅上面的编辑
    • 感谢您的回答。我已经解决了这个问题。这是由于模型未初始化。如果真的是因为这个,我不知道。但我肯定也会使用解决方案
    【解决方案2】:

    在这种情况下,我认为你错误地使用了条件,你可以像这样改变你的条件。它工作正常。因为你使用了承诺,无论如何你的条件满足第一次迭代本身 if(membersProcessed 所以你可以像 if(membersProcessed == req. body.payLoad.length)

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

    【讨论】:

      猜你喜欢
      • 2016-12-01
      • 1970-01-01
      • 2016-09-01
      • 2012-07-11
      • 2018-04-08
      • 2017-04-20
      • 2018-10-02
      • 2016-09-04
      • 2010-10-06
      相关资源
      最近更新 更多