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。 预先感谢
答案 0 :(得分:1)
由于函数正在循环内返回承诺,因此代码执行必须等待所有这些承诺都得到解决。考虑使用Promise.all
或Promise.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)