javascript - Node.js/Mongoose 等待异步 For 循环
问题描述
这是一个初学者的问题。我需要从我的 mongodb 数据库中的数组中查询/查找多个元素。如果至少一个元素通过了 if 语句,我想将错误变量设置为 true。不幸的是,由于异步调用,该变量将提前返回并保持为假。你能给我一个关于如何实现这一目标的提示吗?这是到目前为止的代码:
objects = ["a","b","c"]
for (object of objects) {
loanObject.findById(object._id)
.then((object) => {
if (object) {
isError = true
}
})
.catch(err => console.log(err))
}
console.log(isError) // returns false while should be true
解决方案
使用await和async,你当前正在做的是循环遍历你的数组,对于你正在触发一个db调用并告诉它在它完成但你没有等待它时设置isError的每个元素,所以你的代码开始3 db 调用然后立即移动到日志 isError 我猜在你的代码中默认情况下它是错误的。当 db 调用完成时 isError 被设置为 true 但您的代码在此之前很久就执行了 console.log 。
尝试这个:
for (object of objects) {
const object = await loanObject.findById(object._id).catch(err => console.log(err));
if (object) {
isError = true;
}
}
但更好的解决方案是使用 mongoose $in 运算符:
const object = await loanObject.findOne({ _id: { $in: objects.map(object => object._id) } }).catch(err => console.log(err));
if (object) {
isError = true;
}
推荐阅读
- android - 如何在Android SurfaceView上实现并绘制自定义按钮
- ruby-on-rails - 查找聊天主题
- php - 使用 PHP 动态创建站点地图
- java - 如何使用jackson api将高json层次结构复制到java对象中?
- javascript - ChartJS 在滚动时固定 y 轴
- c - 如何从 gdb 中的多个断点列表中删除断点?
- swift - 文件“MainViewController.swift”是模块“图表”的一部分;忽略导入
- spinnaker - 将参数从一个管道传递到另一个管道的最佳实践
- android - React-native google 登录给开发人员错误
- azure-iot-edge - [Azure][ACR] IoT 边缘模块部署到 raspi 设备失败