首页 > 解决方案 > 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

标签: javascriptnode.jsarraysmongodbpromise

解决方案


使用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;
    }

 

推荐阅读