【问题标题】:How to return array as an output after the execution of forEach loop?执行forEach循环后如何将数组作为输出返回?
【发布时间】:2020-05-24 23:19:44
【问题描述】:

我有一个数组,其中项目 _id 存储在 user 集合中。我最初获取该数组,然后尝试检索与存储在 projects 集合中的 _id (存储在用户集合中)相对应的数据。检索到的数据被推送到数组中,并且该数组作为输出返回。 但我无法这样做。正在返回一个空数组。

var projectInfo= new Array();

users.post('/retrieveProjects', function(user, res, next) { 
  MongoClient.connect(url, function(err,db) {
    if (err) throw err;
    var dbo = db.db("EMWorks");
    dbo.collection("users").findOne({_id:user.body.userid})
    .then(response => {
      if(response)
      {
        console.log(response);
        (response.project).forEach(element => {
          dbo.collection("projects").findOne({_id:element})
          .then(respo => {
            console.log(respo);
            projectInfo.push(respo);
          });
          console.log(projectInfo) ;
        });

      }else{
        console.log("No Projects created yet...!");
      }
    });
  });
});

Output of the code

【问题讨论】:

    标签: reactjs mongodb mongoose


    【解决方案1】:

    问题是dbo.collection("projects").findOne 是异步的并返回一个承诺。 forEach 循环运行并为每个元素生成这些承诺,但不等待其执行。 当循环结束并返回一个空数组时,promise 不会被解析。 你可以等待 promise 被执行,然后才返回数组:

    const promises = [];
    (response.project).forEach(element => {
          promises.push(dbo.collection("projects").findOne({_id:element})
          .then(respo => {
            console.log(respo);
            projectInfo.push(respo);
          });
        }));
       Promise.all(promises).then(function(values) {
          console.log(projectInfo) ;
     });
    

    这也可以通过 map 函数和 async/await 来简化:

    const promises = (response.project).map(async element => {
          const respo  = await dbo.collection("projects").findOne({_id:element});
          projectInfo.push(respo);
        });
       Promise.all(promises).then(function(values) {
          console.log(projectInfo) ;
     });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-23
      • 2018-10-08
      • 1970-01-01
      • 2023-03-28
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      相关资源
      最近更新 更多