【问题标题】:Node.js/Mongoose wait for Async For-loopNode.js/Mongoose 等待异步 For 循环
【发布时间】: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

【问题讨论】:

    标签: javascript node.js arrays mongodb promise


    【解决方案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;
        }
    
     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多