为了账号安全,请及时绑定邮箱和手机立即绑定

等待 forEach 从数据库获取数据

等待 forEach 从数据库获取数据

繁花不似锦 2023-09-07 16:54:26
我正在尝试实现 forEach 从 mongo 数据库获取数据并将每个数据推送到数组。我需要在推送所有数据后控制台记录该数组。我尝试了承诺,但无法得到想要的结果。这是我所拥有的count=[];array.forEach((data)=>{    userDetailsModel.find({UpdateStatusDate:data}).countDocuments()    .exec((err,data)=>{count.push(data)}) })谢谢你的帮助!
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

您错过了应用于一系列承诺的承诺模式的要点。


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); });

});


查看完整回答
反对 回复 2023-09-07
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

您可以使用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);

});


查看完整回答
反对 回复 2023-09-07
?
烙印99

TA贡献1829条经验 获得超13个赞

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


let count = await Promise.all(

  array.map(data =>

    userDetailsModel

      .find({ UpdateStatusDate: data })

      .countDocuments()

      .exec()

  )

);

consle.log(count);


查看完整回答
反对 回复 2023-09-07
  • 3 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信