Javascript 等待forEach从数据库获取数据

Javascript 等待forEach从数据库获取数据,javascript,node.js,Javascript,Node.js,我正在尝试实现一个forEach来从mongo数据库获取数据,并将每个数据推送到一个数组中。在推送所有数据之后,我需要控制台记录该阵列。我尝试了一个承诺,但没有得到想要的结果。这是我得到的 count=[]; array.forEach((data)=>{ userDetailsModel.find({UpdateStatusDate:data}).countDocuments() .exec((err,data)=>{count.push(data)}) })

我正在尝试实现一个forEach来从mongo数据库获取数据,并将每个数据推送到一个数组中。在推送所有数据之后,我需要控制台记录该阵列。我尝试了一个承诺,但没有得到想要的结果。这是我得到的

count=[];
array.forEach((data)=>{
    userDetailsModel.find({UpdateStatusDate:data}).countDocuments()
    .exec((err,data)=>{count.push(data)}) 
})
谢谢你的帮助

您可以使用该方法等待所有承诺

let count = [];
const promiseArray = array.map((data) => (
  new Promise((resolve) => {
    userDetailsModel.find({ UpdateStatusDate: data })
      .countDocuments()
      .exec((err, data) => { resolve(data) })
  })
))
Promise.all(promiseArray).then((values) => {
  count = values;
  console.log(count);
});

你可以用这个方法等待所有的承诺

let count = [];
const promiseArray = array.map((data) => (
  new Promise((resolve) => {
    userDetailsModel.find({ UpdateStatusDate: data })
      .countDocuments()
      .exec((err, data) => { resolve(data) })
  })
))
Promise.all(promiseArray).then((values) => {
  count = values;
  console.log(count);
});


您缺少应用于承诺数组的承诺模式的要点

Exec
将返回一个承诺,该承诺将只解析数据数组的一个元素。 因此,对数组中的每个数据都有一个承诺,代码必须等待所有承诺得到解决。请记住,这将导致对数组中的每个数据进行一次Mongo查询

最好的方法是将数据数组映射到承诺数组,然后使用
Promise.all
等待所有承诺都得到解决:

// get an array of promises for each data to query:
let promises = array.map(data => { 
    return userDetailsModel
        .find({UpdateStatusDate:data})
        .countDocuments()
        .exec(); 

});
    
// when all the promises fulfill 
Promise.all(promises).then(counts => {
    console.log(counts);
    // for each counts log the result:
    counts.forEach(result => { console.log(result); });
});

您缺少应用于承诺数组的承诺模式的要点

Exec
将返回一个承诺,该承诺将只解析数据数组的一个元素。 因此,对数组中的每个数据都有一个承诺,代码必须等待所有承诺得到解决。请记住,这将导致对数组中的每个数据进行一次Mongo查询

最好的方法是将数据数组映射到承诺数组,然后使用
Promise.all
等待所有承诺都得到解决:

// get an array of promises for each data to query:
let promises = array.map(data => { 
    return userDetailsModel
        .find({UpdateStatusDate:data})
        .countDocuments()
        .exec(); 

});
    
// when all the promises fulfill 
Promise.all(promises).then(counts => {
    console.log(counts);
    // for each counts log the result:
    counts.forEach(result => { console.log(result); });
});

确保你的函数前面有
async
关键字,你就可以开始了

let count = await Promise.all(
  array.map(data =>
    userDetailsModel
      .find({ UpdateStatusDate: data })
      .countDocuments()
      .exec()
  )
);
consle.log(count);

确保你的函数前面有
async
关键字,你就可以开始了

let count = await Promise.all(
  array.map(data =>
    userDetailsModel
      .find({ UpdateStatusDate: data })
      .countDocuments()
      .exec()
  )
);
consle.log(count);

非常感谢。我尝试了这个,但它遇到了一个错误,说等待仅在异步中有效function@JerinJoseph对我说“确保你的函数前面有
async
关键字`你添加了吗?@JerinJoseph你可以使用我的版本,因为它不要求函数是
async
谢谢。我试过了,但它出错了,说wait只在async中有效function@JerinJoseph是的,我说“确保你的函数前面有
async
关键字`你添加了吗?@JerinJoseph你可以使用我的版本,因为它不要求函数是
async