如何重新编码此函数以实际等待内部的结果



所以基本上我知道我的代码的问题在哪里

export async function hourlyUpdate(bot:Discord.Client){
let result=new Promise<ActiveSubscriberList>(async (resolve,reject)=>{
let fileData=await getDataFromFile()
let resultList:ActiveSubscriberList={Server:[]}
fileData.channels.forEach(async(element,index)=>{
let tempArr=[]
element.subscriber.forEach(element => {
tempArr.push(element.userID)
})
let tempEntry={Channel:element.channelID,Subscriber:await actualFetch(bot,element.guildID,tempArr)}
resultList.Server.push(tempEntry)
})
resolve(resultList)
}).then(value=>{
})
return result
}
async function actualFetch(bot:Discord.Client,guildID:string,userArr:string[]){
let result= new Promise<string[]>(async (resolve)=>{
let activeSubs=[]
let tempSubArray=await bot.guilds.cache.get(guildID).members.fetch({ user: userArr, withPresences: true })
tempSubArray.forEach(element=>{
activeSubs.push(element.user.id)
})
resolve(activeSubs)
})
return result
}

我认为问题出在循环中,尽管其他异步函数的结果没有得到解决,但循环仍在继续。

我的问题是,是否有人知道如何对这些循环进行重新编码,以便整个函数实际返回结果,而不是空对象。关于如何改进此代码的任何其他评论、提示和建议也将不胜感激。

forEach中的await意味着内部的Promise没有与外部的任何东西链接。相反,使用.map,以便将所有结果作为Promises的数组,然后在该数组上调用Promise.all

您还应该避免显式的Promise构造反模式:

export async function hourlyUpdate(bot: Discord.Client) {
const fileData = await getDataFromFile();
const Server = await Promise.all(fileData.channels.map(async (element) => {
const tempArr = element.subscriber.map(element => element.userID);
const Subscriber = await actualFetch(bot, element.guildID, tempArr);
return { Channel: element.channelID, Subscriber };
}));
return { Server };
}
async function actualFetch(bot: Discord.Client, guildID: string, userArr: string[]) {
const tempSubArray = await bot.guilds.cache.get(guildID).members.fetch({ user: userArr, withPresences: true });
return tempSubArray.map(element => element.user.id);
}

当您不打算重新分配变量时,请记住使用const,而不是let;当您想通过转换另一个数组的所有元素来构造数组时,使用.map是合适的方法。

最新更新