[英]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.