簡體   English   中英

如何解決我的異步功能?

[英]How can I solve my asynchronous function?

我想在數據庫中獲取每個商店的用戶數。 因此,我在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})
        }
    })
}

您從nbr_users(key)返回了一些東西。 您有一個承諾,那么您可以使用.then

因為您處於異步循環中。 功能,你不想失去跟蹤的i我會建議更換您使用匿名立即調用的函數表達式

function(i){
    nbr_users(account.key).then(function(length){
      accountMap[i] = {
        users: length
    })
}(i++);
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)請求都必須等待前一個請求。 有一種方法可以全部運行而無需等待每個人,讓我知道是否要我顯示這種方式-稍微復雜一點

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM