Javascript Wierd async node.js
我试图找到我的用户正在听的所有音乐。我是这样做的:Javascript Wierd async node.js,javascript,node.js,asynchronous,mongoose,Javascript,Node.js,Asynchronous,Mongoose,我试图找到我的用户正在听的所有音乐。我是这样做的: User.find().exec((err, users) => { users.forEach((user, index) => { Musics.count({ idReader: user._id }, (err, count) => { result.push({ mail: user.mail, count: count }); if (inde
User.find().exec((err, users) => {
users.forEach((user, index) => {
Musics.count({ idReader: user._id }, (err, count) => {
result.push({ mail: user.mail, count: count });
if (index >= users.length - 1) {
return res.json(result);
}
});
});
});
它可以工作,但不是每次都可以。有时我只有30%的用户,有时是100%。我想这是因为异步。但我不知道如何做不同。谢谢大家! 你必须遵守承诺才能得到确切的结果
musicListeners = async (req, res) => {
try {
const users = await Users.find({})
try {
const userPromises = [];
for (let user in users)
userPromises.push(Music.count({ idReader: user._id }))
Promise.all(userPromises).then(res => {
return res.send(res)
}, err => {
return res.status(500).send(err)
})
} catch (error) {
return res.status(500).send('Something went wrong')
}
} catch (error) {
return res.status(500).send('Something went wrong')
}
}
Async/Await是编写好代码的好方法,但需要将节点的版本转换为LTS版本。这对6不起作用。你的直觉是正确的。在
forEach
循环中,您为每个用户进行计数查询,当您按顺序发出请求时,它们不一定按顺序得到解决。这就是为什么检查索引
不值得信任的原因。下面是一个应该让它成为现实的片段:
User.find().exec((err, users) => {
// get an array of promises for each count query
var promises = users.map(user =>
Musics.count({ idReader: user._id })
// format ther result
.then(count => ({
mail: user.mail,
count: count
}))
);
// after each request to the db is ready
Promise.all(promises)
.then(result => {
res.json(result)
})
.catch( err => {
console.log(err)
res.status(500).send('Something went wrong')
})
});
result
来自哪里?您的用户集合有多大?用户集合仅包含3个用户result
是在User.find()
之上声明的变量<代码>让结果=新数组()代码>是,每当forEach中的最后一次计数完成时,它都会返回结果,这可能是也可能不是实际完成的最后一次计数。我的节点版本是最新版本。在这里使用async/wait
当然是个好主意。但是你似乎把这个代码复杂化了。。特别是因为您使用的是async/await
它工作得非常好!谢谢我必须学习更多关于承诺的知识,但是你的例子解释了我很多。又来了。