reactjs - 执行forEach循环后如何将数组作为输出返回?
问题描述
我有一个数组,其中项目 _id 存储在用户集合中。我最初是在获取该数组,然后我试图检索与存储在项目集合中的 _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...!");
}
});
});
});
解决方案
问题是它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) ;
});
推荐阅读
- node.js - 在 Express 中更改每条路线的视图目录?
- tabulator - 制表符 - 选择当前页面上显示的行
- kubernetes - Kubernetes - 单集群或多集群
- python - 在 Google Cloud Platform 中为 Keras ML 训练读取存储桶中存储的批量数据的理想方法?
- java - 如何或我可以为多个 JButton (颜色变化)概括一个 If 语句?
- javascript - JS中的新关键字
- javascript - 检查空对象并返回布尔值
- javascript - 交叉点观察者阈值不起作用
- java - BreakOut 游戏:部分石头构造函数未更新
- python - Django REST:OPTIONS 请求注册为 PUT