Создание роли, а затем передача роли члену не работает, есть ли лучший способ справиться с этим?Discord.js - PullRequest
0 голосов
/ 06 июля 2019

Я хочу создать роль на основе сообщения, затем, как только эта роль будет создана, я хочу передать ее тем, кто упоминается в том же сообщении.Роль создается идеально, но правильная роль не дается пользователю.

Я пытался перейти по названию, но это приводит к тому, что роль не найдена, поэтому я пытаюсьполучить роль, основываясь на позиции, в которой она находится, но когда мне нужно выдать роль, она, похоже, не в той правильной позиции

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

Роль отлично справляется справильное имя, однако оно дает роль, которая ранее была первой, а не только что сделанной.

1 Ответ

2 голосов
/ 06 июля 2019

Синхронизация против Async

Скажем, вы планируете забрать своего друга, чтобы пойти на спортивное событие.Вы не уверены, когда они хотят, чтобы вы пришли, поэтому вы звоните им по телефону и спрашиваете их.Некоторое время они думают об этом, а потом говорят вам время.Вы получили запрошенную информацию, поэтому вы кладете трубку.В терминах программирования это может быть примером синхронного кода (иногда его считают «нормальным» кодом в Node.js).

Верните себя в ту же ситуацию.Однако, когда вы звоните своему другу в этот раз, они очень заняты.Вы не хотите их беспокоить, поэтому попросите их позвонить вам позже.Ты вешаешь, а теперь ждешь.Час спустя они перезвонят и скажут время.Это мыслительный процесс асинхронного кода.

За экраном происходит гораздо больше, но ради простоты я не собираюсь бомбардировать вас всей этой информацией.


Обещания

Объект Promise представляет возможное завершение (или сбой) асинхронной операции и ее результирующее значение.

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

The *Метод 1021 *Guild.createRole() возвращает Обещание.

A Promise находится в одном из следующих состояний:

  • в ожидании :исходное состояние, не выполнено и не отклонено.
  • выполнено : означает, что операция завершена успешно.
  • отклонено : означает, что операция завершилась неудачно.

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

Несмотря на то, что вы вызвали метод для создания роли, он не создается мгновенно.Обещание находится в состоянии в ожидании .


Решения

Итак, как нам получить результат Обещания?Нам нужно подождать.

  • Сохраняя простой поток, вы можете использовать ключевое слово await.Все, что он делает, это ждет выполнения или отклонения Обещания, прежде чем продолжить выполнение следующего кода.Рассмотрим следующий пример:

    // 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().Обратный вызов будет вызван с возвращенным значением после выполнения Обещания.В некоторых случаях это просто.Однако обратные вызовы могут очень быстро запутаться, и область действия возвращаемых значений будет ограничена.Рассмотрим этот пример:

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

Обработка ошибок

Когда обещание отклонено, это означает, что что-то пошло не так.Ошибки, возникающие из-за отклоненных обещаний, должны быть обнаружены.Если это не так, вы получите предупреждение в консоли с ошибкой.

  • Вы можете присоединить catch() методы, которые будут работать аналогично then(), за исключением того, что возвращает ошибку в качестве параметра обратного вызова и вызывается только при отклонении.Рассмотрим сжатый пример:

    message.guild.createRole(...)
      .then(role => {...})
      .catch(console.error);
    
  • Вместо того, чтобы присоединять несколько методов catch(), вы можете использовать оператор try...catch.Если какие-либо Обещания внутри блока try отклонены, выполняется код внутри блока catch.Например:

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

Ресурсы

...