簡體   English   中英

javascript 遞歸 function 與數據庫承諾

[英]javascript recursive function with database promises

我為此花費了令人尷尬的時間。 我可以找到幾種可能的解決方案,但我似乎無法根據我的具體情況對它們進行 map。 基本問題是我對如何管理承諾缺乏了解。 是非常接近的,可能是我可以使用的解決方案,但我有一個變體,使它不能根據需要直接工作。

我的數據庫中有一個用戶表。 任何用戶都可以是會員,任何會員都可以有 0 到 n 個推薦人。 這些推薦中的任何一個也可以推薦成員。 給定會員的 member_id,我需要獲取他們所有推薦人及其所有推薦人、推薦人......等等的列表,因此這是一個基本的遞歸問題。 挑戰是……我似乎無法正確處理 promise 交易。

使用 api 調用即可解決問題:

app.get('/api/calculateReferralTotals', (req, res) => {
    const member_id = req.body.member_id;
    knex.select('member_id').from('users').where({referred_by: 
    member_id}).then((referrals) => {
        GetReferrals(referrals);
        // do something with the global_referral_array but
        // have to deal with the promises first
        res.status(200).send({final_referral_list});
    }).catch((error) => {
        console.log("Error in select " + error);
    });
});

var global_referral_array = [];
function GetReferrals(referrals) {
    referrals.forEach((amb) => {
        knex.select('member_id').from('users').where({referred_by: 
        amb.member_id}).then((ref) => {
            if(ref.length>0) {
            ref.forEach((element) => {
                global_referral_array.push(element.member_id);
            });
                GetReferrals(ref);
            }
        }).catch((error) => {
    });
});

遞歸的 function 符合我的預期——我得到了一個推薦成員 ID 的列表,但顯然我必須以某種方式處理異步性質,這就是我被卡住的地方。 我以為我可以通過遞歸構建一系列承諾,然后在返回原始調用時解決這些承諾(可能有一個全局 promise 數組),但這似乎不起作用。 我還嘗試將單個 member_id 傳遞給遞歸 function 並在 DB 調用后繼續循環,所以我只處理一個事件,但這也不起作用。

任何指導將不勝感激!

如果你使用asyc function 會容易得多

不確定它是否有效,但我會試試這個:

async function GetReferrals(referrals) {
    if(!referrals) return [] // you need a condition to stop recursion

    let promises = referrals.map(amb =>knex.select('member_id').from('users').where({referred_by: 
        amb.member_id}))

    let res = await Promise.all(promises)

    return [...res, ...res.map(r => await GetReferrals(r)) ]
});

並在主要通話中:

GetReferrals(referrals).then( result =>
        // do something with the global_referral_array but
        // have to deal with the promises first
        res.status(200).send({final_referral_list});
)

這應該有效。

function GetReferrals(member_id) {
  return knex.select('member_id').from('users').where({referred_by: 
  member_id}).then((referrals) => {
    const referralIds = referrals.map(element => element.member_id)
    return Promise.all(referralIds.map(GetReferrals)).then(referralsReferrals => {
      return referralsReferrals.reduce((final, arr) => final.concat(arr), referralIds)
    })
  })
}

app.get('/api/calculateReferralTotals', (req, res) => {
    const member_id = req.body.member_id;
    GetReferrals(member_id).then(final_referral_list => {
      // do something with the global_referral_array
      res.status(200).send({final_referral_list})
    }).catch((error) => {
      console.log("Error in select " + error);
    })
});

暫無
暫無

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

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