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
它工作得非常好!谢谢我必须学习更多关于承诺的知识,但是你的例子解释了我很多。又来了。