【问题标题】:How to properly do a createReactionCollection如何正确执行 createReactionCollection
【发布时间】:2019-11-03 22:16:54
【问题描述】:

我一直想在用户按下 Check 或 X 的反应时创建一个事件。但是,当我使用该函数时,我收到一个错误消息对象不存在它。

我已经从 awaitReactions 回到了这个,但它没有工作。

编辑: 我对 messageSent 对象做了一个console.log,我得到了这个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)

【问题讨论】:

  • 它看起来像一个错字。尝试使用messageSent.createReactionCollector 而不是messageSent.createReactionCollection
  • 我收到“messageSent.createReactionCollector 不是函数”
  • 我可能已经修复了它,由于某种原因它没有返回消息的对象,所以我将 messageSent = message; 添加到 .then

标签: javascript node.js express discord.js


【解决方案1】:

同步与异步

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

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

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


承诺

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

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

让我们分解代码以更好地理解问题。

  • User.send() 返回一个 Promise。
  • Promise.then() 返回一个 Promise。

因此,您的代码实际上是这样的:

var messageSent = Promise --> Promise

Promise 处于以下状态之一:

  • pending:初始状态,既不履行也不拒绝。
  • fulfilled:表示操作成功完成。
  • rejected:表示操作失败。

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

我对 messageSent 对象做了一个console.log,我得到了这个Promise { <pending> }

虽然您将变量定义为 Promise,但它并没有立即完成,因此还没有返回任何值。它处于 pending 状态。


解决方案

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

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

    // 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() 链。回调将在 Promise 实现时使用返回的值调用。在某些情况下,这很简单。但是,回调很快就会变得混乱,并且返回值的范围会受到限制。考虑这个例子:

    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).'
    
  • 我可能已经修复了它,由于某种原因它没有返回消息的对象,所以我在 .then 中添加了messageSent = message;

    这适用于您的情况,因为 then() 回调中的值将是已实现的 Promise,并且您将变量设置为返回值。不过,这不是最好的主意。


错误处理

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

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

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

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

资源

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2019-09-17
    • 1970-01-01
    • 2014-03-13
    • 2014-03-19
    • 2011-10-22
    相关资源
    最近更新 更多