首页 > 解决方案 > MEAN节点js中的for循环问题

问题描述

我试图在循环 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.jsmean-stackmeanjs

解决方案


您正在同步循环中使用异步函数调用。循环将始终在调用回调函数之前完成。

您将需要某种异步循环。对于本机解决方案,您可以使用 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用于基于回调的解决方案或bluebirdPromises。两者都有一个.map非常适合这个用例的功能。


推荐阅读