【问题标题】:Await reaction on bot message等待对机器人消息的反应
【发布时间】:2020-02-23 20:26:40
【问题描述】:

我正在尝试制作某种投票机器人来计算对消息的反应。机器人发送一条消息,对其做出反应,并计算对他的消息的反应。

当我使用awaitReactions 时,then 不会处理反应。

代码如下:

channel.send(mess)
 .then(async m => {
       await m.react(ok);
       await m.react(ko);
       await m.react(maybe);
       m.awaitReactions((r, u) => { console.log(`filter:${u.username}`); return true; }, {max: 100000})
        .then(collected => {
             console.log("Reacted");
             collected.forEach(c => { console.log(c); });
         })
          .catch(collected => {
              console.log("Catch");
          });
});

当对生成的消息做出反应时,打印的唯一console.log 是过滤器函数中的那个。

为什么then或catch中的console.log没有被执行?

编辑:在awaitRections的函数参数中添加return。添加退货并不能解决问题。

【问题讨论】:

  • awaitReactions 是否返回一个承诺?

标签: javascript discord.js


【解决方案1】:

当您等待反应时,当您在选项对象中传递的参数之一达到时,如时间到了,或者达到最大反应时,承诺就会得到解决。如果未达到任何参数,则不会解析承诺。在你的情况下,你只给出最大的反应(100000),这永远不会达到。

例如,在获得投票结果之前等待 30 秒,您可以这样做:

m.awaitReactions((r, u) => { console.log(`filter:${u.username}`); return true; }, { time: 30000 })
    .then(collected => {
         console.log("Collector ended");
         // Collected is a collection with all the reactions collected
         console.log(collected);
     })
     .catch(collected => {
          console.log("No reaction collected");
     });

如果你想在你的例子中做一些事情,当有人做出反应时,console.log 的“Reacted”,你需要使用 MessageCollector 而不是 message.awaitReactions。你可以这样做:

let collector = message.createReactionCollector((r, u) => { console.log(`filter:${u.username}`); return true; });
collector.on("collect", (reaction, user) => {
     console.log("Reacted");
});

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2020-03-13
    • 2020-01-11
    • 2020-09-01
    • 2021-03-22
    相关资源
    最近更新 更多