我该如何解决我的异步函数?

时间:2018-04-24 09:16:43

标签: javascript node.js asynchronous mongoose

我想获得数据库中每个商店的用户数量。所以我在我的Db中打了两个电话,一个用于商店,另一个用于用户。我有一个问题,我在" nbr_users"中没有任何东西。返回值..你能帮忙吗?

function nbr_users(key) {
    return new Promise((resolve, reject) => {
        db.User.find({
            shop: key
        }, (err, users) => {
            if (err) reject(err)
            else {
                resolve(users.length) // Maybe my problem is here...
            }
        })
    })
}

module.exports = (req, res) => {
    db.Account.find({},
    (err, accounts) => {
        if (err) res.json(err)
        else {
            var accountMap = {}
            var i = 0;
            accounts.forEach(async function(account) {
                accountMap[i++] = {
                    users: await nbr_users(account.key) // the value I want
                }
              });
            res.json({user_list: accountMap})
        }
    })
}

2 个答案:

答案 0 :(得分:1)

您从nbr_users(key)返回了一些内容。您有承诺,然后您可以使用.then

因为您处于异步循环中。功能,你不想忘记i我建议你使用匿名Immediately-invoked function expression

function(i){
    nbr_users(account.key).then(function(length){
      accountMap[i] = {
        users: length
    })
}(i++);

答案 1 :(得分:0)

accounts.forEach(async function(account) {
            accountMap[i++] = {
                users: await nbr_users(account.key) // the value I want
            }
          });

应该更像

var accountMap = {}
var i = 0;
for (let account of accounts) {
   let users = await nbr_users(account.key);
   accountMap[i++] = {
                users: users
            }
}

res.json({user_list: accountMap});

确保您在async功能中运行该功能。

这种方式的缺点是每个后续nbr_users(account.key)请求必须等待前一个请求。有一种方法可以运行它们,而不是每个人都在等待前一个,让我知道你是否希望我这样表现出来 - 它稍微复杂一些