【问题标题】:For loop issue in MEAN node jSMEAN节点js中的for循环问题
【发布时间】:2018-12-27 14:41:43
【问题描述】:

我试图在循环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);

                        }   

                    })
                }

            }


        });

【问题讨论】:

    标签: node.js mean-stack meanjs


    【解决方案1】:

    您正在同步循环中使用异步函数调用。循环总是在你的回调函数被调用之前完成。

    您将需要某种异步循环。对于原生解决方案,您可以使用 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 函数,非常适合这个用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2021-10-25
      相关资源
      最近更新 更多