为什么即使我在其中推入值,空数组仍然仍然是空的?

时间:2019-08-09 15:59:00

标签: javascript arrays node.js loops mongoose

usersList是具有字符串值的有效数组, User.findById(userId)返回预期的用户。 我认为问题出在范围之内,因为forEach方法和FindById方法可以完美工作。

我尝试了很多返回每个值的数组方法。 (例如,地图和过滤器) 我已经阅读了许多有关高级MongoDB技术,范围和数组方法的文档。

const usersList = camp.usersList;
let users = [];
usersList.forEach((userId) => {
  User.findById(userId, (err, user) => {
    if(err) return res.redirect('/admin/db');
    users.push(user);
  })
})
console.log(users);

输出应为[user1,user2,...],而不是[]。

2 个答案:

答案 0 :(得分:2)

async () => {
    const usersList = camp.usersList;
    const users = [];
    for (var userId of usersList)  {
        const user = await User.findById(userId).exec();
        if (!user) return res.redirect('/admin/db');
        users.push(user);
    }
    console.log(users);
}

为了获得更好的性能,您可以使用下面的代码,它不会等待单个请求完成,而是会进行并行调用,从而提高性能

async ()=> {
    try {
        const users_promise = usersList.map(userid => User.findById(userid).exec())
        const users = await Promise.all(users_promise);
    } catch(error) {
        res.redirect('/admin/db');
    }
}

答案 1 :(得分:-1)

使用诺言数组

const userPromises = usersList.map(userid => User.findById(userid))

Promise.all(userPromises).then(users => console.log(users))
                         .catch(() => res.redirect('/admin/db'));