Javascript 为什么即使我在空数组中推送值,它仍然是空的?
usersList是具有字符串值的有效数组, User.findByIduserId按预期返回用户。 我认为问题在于范围块,因为forEach方法和FindById方法工作得很完美 我尝试了许多返回每个值的数组方法。e、 g.映射和过滤器 我已经阅读了很多关于高级MongoDB技术、作用域块和数组方法的文档Javascript 为什么即使我在空数组中推送值,它仍然是空的?,javascript,arrays,node.js,loops,mongoose,Javascript,Arrays,Node.js,Loops,Mongoose,usersList是具有字符串值的有效数组, User.findByIduserId按预期返回用户。 我认为问题在于范围块,因为forEach方法和FindById方法工作得很完美 我尝试了许多返回每个值的数组方法。e、 g.映射和过滤器 我已经阅读了很多关于高级MongoDB技术、作用域块和数组方法的文档 const usersList = camp.usersList; let users = []; usersList.forEach((userId) => { User.fin
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,…],而不是[]
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');
}
}
改用承诺数组
const userPromises = usersList.map(userid => User.findById(userid))
Promise.all(userPromises).then(users => console.log(users))
.catch(() => res.redirect('/admin/db'));
在将用户推送到用户数组之前,请在控制台上打印该值。日志“user is”+user;。问题可能是推送从未被调用。若数据库中并没有用户。其次,您打印用户数据库查询的时间没有完成async.User.findById看起来像一个异步函数User.findById asynchronous?forEach忽略异步功能;除了在函数中不使用async/await外,在函数调用users.pushuser之前,您还可以先点击console.logusers。谢谢您的回答,async/await为我解决了这个问题!应该注意,Nayan将循环从.forEach更改为.forEach的原因是.forEach不支持异步。forEach使用回调,因此我们不应该在那里使用wait。所以当我们需要等待回应的时候。你不应该使用forEach。据我所知,猫鼬的回报是一个,而不是一个承诺。你需要打电话给我相信。@Khauri你是对的,但结果仍然是可以的,因此可以与wait一起使用。User.findByIduserId.then基本上是User.findByIduserId.exec.then.Javascript的快捷方式