循环结束后,NodeJS在查询中查找循环结果

时间:2018-12-19 09:50:00

标签: node.js mongodb mongoose mongoose-schema

var user_id = '98-XXXXXXXX'

Contact.find({user_id: user_id})
.exec(function (err, results) {
  if (err) { 
    return next(err); 
  }
    var finalArray = [];
    for(var i = 0; i< results[0].Total; i++) {

      if(results[0].Contacts[i].name != "SPAM") {

       for(var j = 0; j < results[0].Contacts[i].phoneNumbers.length; j++){

           var number = results[0].Contacts[i].phoneNumbers[j].number
           number = number.replace(/ /g,'');
            var user_id = number.substr(number.length - 10); 

                Login.find({user_id:user_id})
                .exec(function(err,results) {
                if(err) {
                return next(err); }

                    var intCount = results.length;
                        if (intCount > 0)
                        {
                            console.log('called')
                            finalArray.push(results[0])
                            console.log(finalArray)
                        } 
               });

            }
         }

        //console.log(i,results[0].Total - 1);
        //if(i == results[0].Total - 1)



    } 
                    console.log('Ended Here',finalArray)
                    var responseTosend = {"message":finalArray,"user_id":user_id}
                    return  res.send(responseTosend);

});

EndedHere []首先是空的,之后我得到了正确的login.find查询结果。任何想法如何在所有计算后获取finalArray。 预先感谢

2 个答案:

答案 0 :(得分:1)

由于函数正在循环内返回承诺,因此代码执行必须等待所有这些承诺都得到解决。考虑使用Promise.allPromise.map等待。 Reference

答案 1 :(得分:0)

如前所述,这样的结构不会返回结果,但是会在中间函数或对象完成之前返回结果,因为nodejs不知道它应该首先等待结果。

<form action="<?php echo languageURL(0, ''.$g['url'].'products.html'); ?>" method="get">

<div class="wrapper" style=" padding:20px;">
  <div class="range-slider">
      <input type="text" class="js-range-slider" value="" />
  </div>
</div>

    <input type="submit" class="btn-primary goo" value="Търсене" />
</form>

这是使用promise和.map函数的更好版本。注意,我们是如何用.map()替换for循环的(您可以将它视为.forEach + push()或for()+ push()的简写。如果正确配置,Mongoose会返回Promises,因此您甚至不会必须手动定义它们,我们可以直接在.map中返回它们。

const x = [1,2,3]
let results = []

for (let i = 0; i < x.length; i++){
  results.push(someAsyncJobLikeADatabaseCall(x[i]))
}

// this will not return the results, but the intermediate async objects/functions
console.log(results)