【问题标题】:looping over an array of mongodb document ids and querying that id and storing the result in a new array gives empty array循环遍历 mongodb 文档 id 数组并查询该 id 并将结果存储在一个新数组中给出空数组
【发布时间】:2020-03-01 04:52:28
【问题描述】:

以下是我遇到问题的代码:

    const users = []
    event.registeredUsers.forEach(userId => {
            User.findOne({ _id: userId }).then(user => {
                console.log(user) // logs a valid user
                users.push(user)
            });
        });

    console.log(users) // logs empty array

该事件是一个 MongoDB 文档,该文档具有注册用户字段,该字段是 MongoDB 对象 ID 的数组。当控制台记录用户在 then 块中返回时,它确实显示了一个有效的用户文档,但是当循环完成后 res.send(users) 时,它在浏览器中显示空数组。

【问题讨论】:

    标签: javascript node.js mongodb express nosql


    【解决方案1】:

    您正试图在 forEach 中执行基于 Promise 的代码,但它并没有按照您期望的方式工作。使用for..ofPromise.all

    for..of(顺序)

    const users = []
    for(const userId of event.registeredUsers) {
        User.findOne({ _id: userId }).then(user => {
           console.log(user) // logs a valid user
           users.push(user)
         });
     }
    
    console.log(users) 
    

    Promise.all(并行)

    Promise.all(event.registeredUsers.map(userId => {
        return User.findOne({ _id: userId }).then(user => {
           console.log(user) // logs a valid user
           return user;
         });
     }).then(users => console.log(users));
    
    

    【讨论】:

      【解决方案2】:

      这是一个事件循环问题。由于 User.findOne 是一个Promise.then() 函数将在console.log(users) 之后执行。

      这是一个关于 JavaScript 事件循环的好视频:https://www.youtube.com/watch?v=8aGhZQkoFbQ

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        • 2014-11-03
        • 2021-07-13
        • 2019-03-06
        • 1970-01-01
        相关资源
        最近更新 更多