Node.js/Mongoose 等待异步 For 循环
Posted
技术标签:
【中文标题】Node.js/Mongoose 等待异步 For 循环【英文标题】:Node.js/Mongoose wait for Async For-loop 【发布时间】:2021-10-18 20:15:00 【问题描述】:这是一个初学者的问题。我需要从我的 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
【问题讨论】:
【参考方案1】:使用 await 和 async,您当前正在执行的操作是遍历您的数组,对于您正在触发 db 调用并告诉它在完成但您不等待它时设置 isError 的每个元素,所以您的代码开始 3 db 调用,然后立即移动到日志 isError 我猜在你的代码中默认情况下它是 false 。当 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;
【讨论】:
以上是关于Node.js/Mongoose 等待异步 For 循环的主要内容,如果未能解决你的问题,请参考以下文章
??? MongoDB ??? Node.js ????????? Mongoose ??