首页 > 解决方案 > 创建角色,然后将角色赋予成员不起作用,有没有更好的方法来处理这个问题?不和谐.js

问题描述

我想根据消息创建一个角色,然后一旦创建了该角色,我想将其提供给同一消息中提到的那些。角色创建得非常好,但没有给用户正确的角色。

我试过按名字命名,但这会导致找不到角色,所以我试图根据角色所处的位置来获取角色,但是当我需要给出角色时,它不会t 似乎处于正确的位置

var nameOC = getClanName(message.content);
        console.log(nameOC);
        message.guild.createRole({
            name: nameOC,
            hoist: true,
            mentionable: false,
            position: 1,
        });
        var role = message.guild.roles.find(role => role.position === 1);
        console.log(role);
        list.members.forEach(member => {
           if(message.content.includes(member)){
              member.addRoles(role);          
            }
        });
        message.channel.send(nameOC);

使用正确的名称可以完美地制作角色,但是它给出的角色是以前的第一个角色,而不是刚刚制作的角色。

标签: javascriptdiscorddiscord.js

解决方案


同步与异步

假设您计划接您的朋友去参加体育赛事。你不确定他们希望你什么时候来,所以你给他们打电话问他们。他们想了一会儿,然后告诉你一个时间。你得到了你要求的信息,所以你挂断了。在编程术语中,这将是同步代码的一个示例(有时被认为是 Node.js 中的“正常”代码)。

让自己回到同样的境地。然而,当你这次打电话给你的朋友时,他们很忙。你不想打扰他们,所以你让他们稍后给你打电话。你挂断了,但现在你等着。一个小时后,他们给你回电话,告诉你时间。这就是异步代码的思考过程。

屏幕后面还有很多内容,但为简单起见,我不会用所有这些信息轰炸你。


承诺

Promise对象表示异步操作的最终完成(或失败)及其结果值。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Guild.createRole()方法返回一个 Promise。

APromise处于以下状态之一:

  • 待定:初始状态,既不满足也不拒绝。
  • 已完成:表示操作成功完成。
  • denied:表示操作失败。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

尽管您调用了该方法来创建角色,但它并不是立即创建的。Promise 处于待处理状态。


解决方案

那么,我们如何检索 Promise 的结果呢?我们必须等待它。

  • 保持简单的流程,您可以使用await关键字。它所做的只是等待 Promise 被履行或拒绝,然后再继续执行进一步的代码。考虑以下示例:

    // Asynchronous context (meaning within an async function) needed to use 'await.'
    
    var role = await message.guild.createRole(...);
    console.log(role);
    // Continue using the 'role' variable...
    
  • 或者,您可以使用then()链。回调将在 Promise 实现时使用返回的值调用。在某些情况下,这很简单。但是,回调很快就会变得混乱,并且返回值的范围会受到限制。考虑这个例子:

    message.guild.createRole(...)
      .then(role => {
        console.log(role);
        // Continue using the 'role' variable...
      });
    

错误处理

当一个 Promise 被拒绝时,这意味着出现了问题。必须捕获源自被拒绝的 Promise 的错误。如果不是,您将在控制台中收到带有错误的警告。

  • 您可以附加catch()与 类似的方法then(),除了将错误作为其回调参数返回并且仅在被拒绝时调用。考虑这个精简的例子:

    message.guild.createRole(...)
      .then(role => {...})
      .catch(console.error);
    
  • catch()您可以使用try...catch语句,而不是附加多个方法。如果try块内的任何 Promise 被拒绝,catch则执行块内的代码。例如:

    try {
      var role = await message.guild.createRole(...);
      await role.delete(); // Maybe not a logical example...
    } catch(err) {
      console.error(err);
    }
    

资源


推荐阅读