我想做一个投票机器人来计算对一条消息的反应。机器人发送一条消息,对其作出反应,并计算对其消息的反应。
当我使用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
是filter函数中的那个。
为什么then
或catch
中的console.log
没有执行?
编辑:在AwaitRections
的函数参数中添加return。添加返回并不能解决这个问题。
当您等待反应时,当您在options对象中传递的参数之一达到时(如时间到了,或达到最大反应数),承诺就会被解决。如果未达到任何参数,则不解析承诺。在你的情况下,你只给出最大的反应(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");
});
如果您想做像您的例子中的“reacted”的console.log当某人做出反应时,您需要使用MessageCollector而不是Message.AwaitReactions。您可以执行:
let collector = message.createReactionCollector((r, u) => { console.log(`filter:${u.username}`); return true; });
collector.on("collect", (reaction, user) => {
console.log("Reacted");
});