Как правильно сделать createReactionCollection - PullRequest
0 голосов
/ 21 июня 2019

Я хотел создать событие, когда пользователь нажимает на реакцию, которая является проверкой или X. Хотя, когда я использую функцию, я получаю ошибку, что она не существует для объекта сообщения.

Я уже от awaitReactions вернулся к этому, и это не сработало.

EDIT: Я сделал console.log для объекта messageSent и получил Promise { <pending> }

var messageSent = user.send({embed})
    .then(function (message) {
         message.react('✅')
         message.react('❎')
     });
messageSent.createReactionCollection(r => ['✅','❎'].includes(r.emoji.name))
     .on('collect', r => {
         if (r.emoji.name == '✅') {
             user.send("Verified! ✅")
          } else if (r.emoji.name == '❎') {
             user.send("Canceled! ❎")
          }
      });   
  }
TypeError: messageSent.createReactionCollection is not a function
    at app.post (C:\Users\teddy\Desktop\Verify\app.js:46:25)
    at Layer.handle [as handle_request] (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\index.js:335:12)
    at next (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\index.js:275:10)
    at expressInit (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\middleware\init.js:40:5)
    at Layer.handle [as handle_request] (C:\Users\teddy\Desktop\Verify\node_modules\express\lib\router\layer.js:95:5)

1 Ответ

1 голос
/ 23 июня 2019

Синхронизация против Асинхронного

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

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

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


Обещания

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

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

Давайте разберем код, чтобы лучше понять проблему.

  • User.send() возвращает обещание.
  • Promise.then() также возвращает обещание.

Следовательно, ваш код действительно выглядит так:

var messageSent = Promise --> Promise

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

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

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

Я сделал console.log для объекта messageSent и получил это Promise { <pending> }

Несмотря на то, что вы определили переменную как Обещание, она не завершена сразу, и поэтому никакое значение не возвращается Он находится в состоянии в ожидании .


* Решения 1070 * Итак, как нам получить результат Обещания? Мы должны ждать этого. Сохраняя простой поток, вы можете использовать ключевое слово await. Все, что он делает, это ждет выполнения или отклонения Обещания, прежде чем продолжить выполнение следующего кода. Рассмотрим следующий пример: // Asynchronous context (meaning within an async function) needed to use 'await.' var messageSent = await user.send(embed); await messageSent.react('✅'); await messageSent.react('❎'); // Create reaction collector. В качестве альтернативы, вы можете придерживаться then() цепей. Обратный вызов будет вызван с возвращенным значением после выполнения Обещания. В некоторых случаях это просто. Однако обратные вызовы могут очень быстро запутаться, и область действия возвращаемых значений будет ограничена. Рассмотрим этот пример: user.send(embed) .then(messageSent => { messageSent.react('✅') .then(() => messageSent.react('❎')) .then(() => { // Create reaction collector. }); }); // Keep in mind that the code here will be executed immediately after 'user.send(embed).' Я мог исправить это, по какой-то причине он не возвращал объект сообщения, поэтому я добавил messageSent = message; в .then Это работает в вашем случае, потому что значение в обратном вызове then() будет выполненным Обещанием, и вы устанавливаете переменную в возвращаемое значение. Это не лучшая идея. Обработка ошибок

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

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

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

    try {
      const user = await bot.fetchUser('someID');
      await user.send(embed);
    } catch(err) {
      console.error(err);
    }
    

Ресурсы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...