javascript - Promise.all 无法与 Mongo 查询数组一起正常工作
问题描述
我有一个路由数组(推荐路由),我需要对其进行迭代并从 MongoDB 获取路由的所有者(用户)。然后,在从数据库中获取路由后,我将一个额外的userObj附加到路由。
let promiseArr = [];
for (let index = 0; index < obj.recommendedRoutes.length; index++) {
console.log("Pushed: "+index);
promiseArr.push(
User.find({
_id : obj.recommendedRoutes[index].userId,
},(err,data) => {
if(err) {
console.log("Database error: " + err);
}else{
obj.recommendedRoutes[index].userObj = data[0].toObject();
console.log("Completed: "+index);
}
})
);
}
将userObj附加到数组中的所有路由对象后,我需要返回此数组。因此,我将所有查询推送到promiseArr中,并使用 Promise.all 确保仅在解决所有承诺后才返回数组。
Promise.all(promiseArr)
.then(() => {
console.log("Return Object");
return res.status(200).send({
success: true,
message: "Successfully retrieved Recommended Routes/Carpools",
obj: obj,
});
})
.catch((e) => {
throw "There was an error: "+e;
});
问题是它偶尔会在承诺解决之前返回数组。预期输出:
Pushed: 0
Pushed: 1
Completed: 1
Completed: 0
Return Object
偶尔会发生什么:
Pushed: 0
Pushed: 1
Completed: 1
Return Object
Completed: 0
解决方案
您没有使用 Promises 而是使用回调...
这是正确的方法:
for (let index = 0; index < obj.recommendedRoutes.length; index++) {
console.log('Pushed: ' + index);
promiseArr.push(
User.find({
_id: obj.recommendedRoutes[index].userId,
}).then((data) => {
obj.recommendedRoutes[index].userObj = data[0].toObject();
console.log('Completed: ' + index)
}, err => console.log('Database error: ' + err))
);
}
推荐阅读
- etl - 关于 apache nifi:互联网上的端点之间是否有流文件管道?
- python - FutureWarning:元素比较失败;从熊猫数据框中删除所有行时
- javascript - 是否可以使用箭头函数作为变量
- sql - 转换为 base64
- c++ - 为什么需要WCHAR相关的代码处理
- spring-boot - Springboot健康检查请求被@RequestMapping(value="/**")
- linux - 如何编写没有从地址和寄存器地址的消息,并且重复开始?
- c# - 选定对象的 LINQ 计数字段
- javascript - 类型错误:运行时未定义
- javascript - 图像裁剪问题 react-image-crop