嘿所以我正在使用discord.js
制作不和谐机器人的排行榜我想用他们的名字而不是他们的ID来显示用户,所以使用discord.js
我使用函数{{1 }}
.fetchUser(ID)
是一种承诺,可能需要一些时间,具体取决于带宽。
因为.fetchUser(ID)
使用了一个promise我的代码不再是Async,我想通过将代码放在一个promise中它会运行Async。
我错了。
我的代码:
discord.js
答案 0 :(得分:0)
你必须从你收到的Promise
链接起来。 Client#fetchUser()
会返回您 等待的Promise
,但还不够。你必须传播Promise
。如果函数调用链中的某些内容是异步的,则应该将整个链视为异步。
您在this.list
内填写fetchUser(...).then(...)
,这不一定是坏事,只要您在{{1}之前尝试不使用list
解决方案链完成了。你不是那样做的;你马上fetchUser
。
考虑原始函数的缩写形式:
resolve(this.list)
return new Promise((resolve, reject) => {
this.list = [];
for (let i in users) {
// A promise is created right here
client.fetchUser(i).then((user) => {
// This will populate list AFTER the then callback
this.list.push([user.username.substring(0, 13), score])
});
}
// You aren't waiting until the promise created by fetchUser completes
resolve(this.list);
})
无法被视为"完成"直到所有相关用户都加载了他们的个人资料并检索了他们的分数。考虑到这一点,我们可以使用this.list
来获取Promise.all()
的数组,然后在所有提供的promise都已解决后解析。所以要等到那样,我们会做这样的事情,这仍然不是理想的,但是正确等待:
Promise
考虑这个实现。我对您的代码做了一些假设,因为您使用return new Promise((resolve, reject) => {
this.list = [];
// This is an array of Promises
const discordUsersPromise = users.map(user => client.fetchUser(user));
// Wait till all the fetchUser calls are done
const listIsPopulatedPromise = Promise.all(discordUsersPromise).then(dUsers => {
// This replaces your for (let i in users) {}
Object.entries(users).forEach((user, idx) => {
const score = this.getScore(user);
const discordUser = dUsers[idx];
this.list.push([discordUser.username.substring(0, 13), score])
});
});
// We still have to wait for the list to be completely populated
return listIsPopulatedPromise.then(() => this.list);
})
但不包括this.list
的实例,但大多数应该是相同的:
this