передать результат из AwaitReactions из функции discord.js - PullRequest
0 голосов
/ 03 июня 2019

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

Функция ниже работает отлично.Тем не менее, я хочу передать результат из функции из функции, чтобы я мог сделать оператор if else за ее пределами, и вот где я застрял.

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


     const agree = "✅"
     const disagree = "❌"
     let msg = await message.author.send("You have made the maximum number of decks. Would you like to delete one of your decks in order to make a new one? Please react with one of the following...")
     await msg.react(agree)
     await msg.react(disagree)


     const filter = (reaction, user) => {
     return ['✅', '❌'].includes(reaction.emoji.name) && user.id === message.author.id;
     };
     const reactions = await msg.awaitReactions(filter, {
        max: 1
        }).then(collected => {
        const result = collected.last();

        })
        return result;
        }

     deleteDeckQuestion(function(result){
        console.log(result)
        }).catch(err => console.error(err))

Приведенный выше код приводит к тому, что «undefined» регистрируется в консоли при запуске deleteDeckQuestion,В противном случае ошибок нет.Я бы хотел, чтобы переменная Results была доступна для меня вне функции, чтобы я мог сделать оператор if else, основываясь на том, какую реакцию пользователь добавил к вопросу.

Я попытался поместить оператор if else, который хотелиспользовать с результатами deleteDeckQuestion внутри асинхронной функции, и она работала нормально, но затем внутри результата «Да» этой функции я хочу поместить другую асинхронную функцию, чтобы спросить, какая колода 1, 2 или 3 должна быть удалена и иметь такую ​​жесценарий реакции-ответа-на-вопрос.Просто спасает пользователя, набирающего больше, чем нужно, для удобства мобильных пользователей.

Было бы проще, если бы я просто поместил асинхронную функцию в другую асинхронную функцию?Что-то подсказывает мне, что это не лучшая идея с точки зрения эффективности.В конечном итоге эти реакции приведут к использованию запросов mysql, которые мне удобно использовать, но они получатся довольно длинными, а функции внутри других функций просто кажутся беспорядком ... не уверен, является ли это частью "ада обратного вызова" I 'Мы читали радости, хотя ...

Спасибо за любую помощь заранее.

1 Ответ

0 голосов
/ 03 июня 2019

collected в вашем then() обратном вызове и reactions - это один и тот же объект. Однако область действия result ограничена обратным вызовом.

В этом примере кода collected является результатом выполненного обещания msg.awaitReactions(...). Затем result объявляется в той же области видимости и, следовательно, доступно там, где вам нужно.

const collected = await msg.awaitReactions(filter, { max: 1 })
  .catch(console.error);

const result = collected.first();

MDN: Асинхронное программирование , await, then(), scope
Discord.js: Message.awaitReactions()

...