等待 forEach 从数据库获取数据

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


count=[];

array.forEach((data)=>{

    userDetailsModel.find({UpdateStatusDate:data}).countDocuments()

    .exec((err,data)=>{count.push(data)}) 

})

谢谢你的帮助!


繁花不似锦
浏览 112回答 3
3回答

HUX布斯

您错过了应用于一系列承诺的承诺模式的要点。Exec将返回一个仅针对数据数组的一个元素进行解析的承诺。因此,您将对数组中的每个数据都有一个承诺,并且您的代码必须等待所有承诺都得到解决。请记住,这将导致数组中的每个数据执行一次 Mongo 查询。最好的方法是将数据数组映射到 Promise 数组,并用于Promise.all等待所有 Promise 解析:// 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); });});

慕姐4208626

您可以使用Promise.all()方法在所有承诺之后等待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);});

烙印99

确保你的函数async前面有关键字,你就可以开始了let count = await Promise.all(  array.map(data =>    userDetailsModel      .find({ UpdateStatusDate: data })      .countDocuments()      .exec()  ));consle.log(count);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript