首页 文章

Node.js Discord bot等待角色在继续之前删除

提问于
浏览
0

我正在Node.js中创建一个Discord bot,我在其中进行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)

正如您所看到的,我正在设置Timeout以等待删除排名,然后再应用新角色 . 我知道这是非常糟糕和低效的,所以有人可以用回调或承诺来帮助我吗?

2 回答

  • 0

    承诺一系列承诺,你应该承诺

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

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

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

相关问题