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

Typescript 如何重新编码此函数以实际等待内部结果,typescript,async-await,discord.js,Typescript,Async Await,Discord.js,所以基本上我知道我的代码的问题在哪里 export async function hourlyUpdate(bot:Discord.Client){ let result=new Promise<ActiveSubscriberList>(async (resolve,reject)=>{ let fileData=await getDataFromFile() let resultList:ActiveSubscriberList={S

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

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
}
导出异步函数hourlyUpdate(bot:Discord.Client){
让结果=新承诺(异步(解析、拒绝)=>{
让fileData=等待getDataFromFile()
let resultList:ActiveSubscriberList={Server:[]}
fileData.channels.forEach(异步(元素,索引)=>{
让tempArr=[]
element.subscriber.forEach(element=>{
tempArr.push(element.userID)
})
让tempEntry={Channel:element.channelID,订户:wait actualFetch(bot,element.guildID,tempArr)}
resultList.Server.push(tempEntry)
})
解析(结果列表)
}).然后(值=>{
})
返回结果
}
异步函数actualFetch(bot:Discord.Client,guildID:string,userArr:string[]){
让结果=新承诺(异步(解析)=>{
让activeSubs=[]
让tempSubArray=wait bot.guilds.cache.get(guildID.members.fetch({user:userArr,withPresences:true})
tempSubArray.forEach(元素=>{
activeSubs.push(element.user.id)
})
解析(activeSubs)
})
返回结果
}
我认为问题在于循环继续,尽管另一个异步函数的结果没有被重新解决


我的问题是,是否有人知道如何对这些循环进行重新编码,以便整个函数实际返回结果,而不是空对象。是否有其他注释,关于如何改进此代码的提示和建议也很受欢迎。

您的
wait
forEach
内部意味着内部的承诺不会与外部的任何东西捆绑在一起。相反,请使用
.map
将所有结果作为承诺数组,然后在该数组上调用
Promise.all

您还应避免:


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

您不能将
async
forEach
一起使用,将其切换为
for
for…of循环。
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);
}