簡體   English   中英

MEAN節點jS中的循環問題

[英]For loop issue in MEAN node jS

我正在嘗試在循環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);

                        }   

                    })
                }

            }


        });

您正在同步循環內使用異步函數調用。 循環將始終在調用回調函數之前完成。

您將需要某種異步循環。 對於本機解決方案,可以使用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函數,非常適合此用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM