Node JSjs 不和谐机器人等待角色删除,然后再继续



我正在 Node 中制作一个 Discord 机器人.js在那里我进行 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)

如您所见,我正在设置超时以等待排名删除完成,然后再应用新角色。我知道这是非常糟糕和低效的,所以有人可以帮助我回电或承诺吗?

为了承载一系列的承诺,你应该承诺。

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

你应该学会使用 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 将使其使代码等到承诺被解析(并且还返回承诺的对象)。
我们不需要对象,我们只想等待。

我还将一些var更改为const。我建议也使用letconst

最新更新