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);
}