Node.js Discord 机器人在继续之前等待角色移除
Node.js Discord bot wait for roles to remove before proceeding
我正在 Node.js 中创建一个 Discord 机器人,我在其中进行 API 调用以获取某人在游戏中的等级,然后在服务器中为该人应用等级角色。
在应用那个角色之前,我必须先从那个人那里删除所有当前的角色,然后再应用新的等级角色。
问题是这是异步的,所以我开始删除所有角色,当我添加新角色时,它仍在删除角色,导致新角色立即被删除。
我无法理解回调和承诺,所以我不知道如何进行。以下是我的代码:
for(var i = 0; i < allranks.length; i++){
var role = message.member.guild.roles.find('name', allranks[i]);
message.member.removeRole(role).catch(err => console.log(err));
}
setTimeout(function(){
var role = message.member.guild.roles.find('name', ranks[highestRank]);
message.member.addRole(role).catch(err => console.log(err));
message.reply("Rank updated to " + highestRank);
}, 2000)
如您所见,我设置了一个超时以等待等级移除完成,然后再应用新角色。我知道这非常糟糕且效率低下,所以有人可以通过回调或承诺帮助我吗?
你应该学习与 async/await 一起工作,它会得到回报。
你可以这样做:
async function updateRank(member) {
for(const i = 0; i < allranks.length; i++){
const role = message.member.guild.roles.find('name', allranks[i]);
await message.member.removeRole(role); //Notice the await.
}
const role = message.member.guild.roles.find('name', ranks[highestRank]);
await message.member.addRole(role); //Notice the await here too.
message.reply("Rank updated to " + highestRank);
}
关键字 await
将使其生效,因此代码将等待承诺被解决(以及 returns 承诺的对象)。
我们不需要对象,我们只想等待。
我也把一些var
改成了const
。我建议也使用 let
和 const
。
为了承载一系列的承诺,你应该Promise.all
Promise.all(allranks.map(function(eachrank){
var role = message.member.guild.roles.find('name',eachrank);
return message.member.removeRole(role) ;
})).then(function(data){
var role = message.member.guild.roles.find('name', ranks[highestRank]);
return message.member.addRole(role)
}).then(function(){
return message.reply("Rank updated to " + highestRank)
}).catch(function(err){
console.log(err);
})
我正在 Node.js 中创建一个 Discord 机器人,我在其中进行 API 调用以获取某人在游戏中的等级,然后在服务器中为该人应用等级角色。
在应用那个角色之前,我必须先从那个人那里删除所有当前的角色,然后再应用新的等级角色。
问题是这是异步的,所以我开始删除所有角色,当我添加新角色时,它仍在删除角色,导致新角色立即被删除。
我无法理解回调和承诺,所以我不知道如何进行。以下是我的代码:
for(var i = 0; i < allranks.length; i++){
var role = message.member.guild.roles.find('name', allranks[i]);
message.member.removeRole(role).catch(err => console.log(err));
}
setTimeout(function(){
var role = message.member.guild.roles.find('name', ranks[highestRank]);
message.member.addRole(role).catch(err => console.log(err));
message.reply("Rank updated to " + highestRank);
}, 2000)
如您所见,我设置了一个超时以等待等级移除完成,然后再应用新角色。我知道这非常糟糕且效率低下,所以有人可以通过回调或承诺帮助我吗?
你应该学习与 async/await 一起工作,它会得到回报。
你可以这样做:
async function updateRank(member) {
for(const i = 0; i < allranks.length; i++){
const role = message.member.guild.roles.find('name', allranks[i]);
await message.member.removeRole(role); //Notice the await.
}
const role = message.member.guild.roles.find('name', ranks[highestRank]);
await message.member.addRole(role); //Notice the await here too.
message.reply("Rank updated to " + highestRank);
}
关键字 await
将使其生效,因此代码将等待承诺被解决(以及 returns 承诺的对象)。
我们不需要对象,我们只想等待。
我也把一些var
改成了const
。我建议也使用 let
和 const
。
为了承载一系列的承诺,你应该Promise.all
Promise.all(allranks.map(function(eachrank){
var role = message.member.guild.roles.find('name',eachrank);
return message.member.removeRole(role) ;
})).then(function(data){
var role = message.member.guild.roles.find('name', ranks[highestRank]);
return message.member.addRole(role)
}).then(function(){
return message.reply("Rank updated to " + highestRank)
}).catch(function(err){
console.log(err);
})