首页 > 解决方案 > 等到 forEach 从 db 获取数据

问题描述

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

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

谢谢你的帮助!

标签: javascriptnode.js

解决方案


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

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

最好的方法是将你的数据数组映射到一个 promise 数组,然后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); });
});

推荐阅读