如何创建异步代码?

时间:2018-06-06 18:20:19

标签: javascript asynchronous discord.js

嘿所以我正在使用discord.js制作不和谐机器人的排行榜我想用他们的名字而不是他们的ID来显示用户,所以使用discord.js我使用函数{{1 }}

.fetchUser(ID)是一种承诺,可能需要一些时间,具体取决于带宽。

因为.fetchUser(ID)使用了一个promise我的代码不再是Async,我通过将代码放在一个promise中它会运行Async。

我错了。

我的代码:

discord.js

1 个答案:

答案 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