我正在玩message.react
函数和awaitReactions https://discord.js.org/#/docs/main/stable/class/Message?scrollTo=awaitReactions功能,我注意到一些让我困扰的事情。
我试图确定是否应该使用收集器或client.on('messageReactionAdd')
(这是另一个问题)以下方法:
- 发送消息
- 添加反应
- 每次添加反应时执行某些操作(X秒)
所以我做了一个简单的例子来开始,有一个过滤器返回true
每次,我都注意到收集器正在收集我的机器人添加到消息中的最后一个表情符号。这是代码
const emojiNext = '➡';
const emojiPrevious = '⬅';
const emojiClap = '????';
function filter(reaction) {
console.log('reacted to: ', reaction.emoji.name);
return true;
}
function sleep(ms, a){
return new Promise(resolve=>{
setTimeout(resolve,ms);
}).then(d => a);
}
function sendList(channel){
channel.send('foo')
.then(msg => {
console.log('First');
return msg.react(emojiPrevious);
})
.then(msgReaction => {
console.log('Second', msgReaction.message.reactions.keys());
return msgReaction.message.react(emojiNext);
})
.then(msgReaction => {
console.log('Third', msgReaction.message.reactions.keys());
return msgReaction.message.react(emojiClap);
})
// .then(msgReaction =>{
// return sleep(100, msgReaction);
// })
.then(msgReaction => {
console.log('Fourth', msgReaction.message.reactions.keys());
msgReaction.message.awaitReactions(filter, {max: 2, time: 1000, errors: ['time']})
.then(collected => {
console.log('ending', collected);
})
.catch(collected => {
console.log(`After 5 sec, only ${collected.size} out of 2 reacted: ${collected.map((v,k) => k)}`);
});
});
}
Debug
这个例子比我做的第一个例子更成熟一些,因为我尝试了一些调试。
该示例发送一条消息,附加链式 Promise 3 表情符号,然后开始收集表情符号。
但是,如以下日志所示,收集了最后一个表情符号(我自己从未按过任何表情符号,并且我独自在我的服务器上):
First
Second [Map Iterator] { '⬅' }
Third [Map Iterator] { '⬅', '➡' }
Fourth [Map Iterator] { '⬅', '➡', '????' }
reacted to: ????
After 5 sec, only 1 out of 2 reacted: ????
But 有时(这取决于)它工作正常,日志如下:
First
Second [Map Iterator] { '⬅' }
Third [Map Iterator] { '⬅', '➡' }
Fourth [Map Iterator] { '⬅', '➡', '????' }
After 5 sec, only 0 out of 2 reacted:
我最后在火车上进行了测试,网络不规则可能是原因。
所以我尝试了其他方法,我添加了 sleep 函数,它需要一定的毫秒数和一个值,并返回一个承诺,一旦经过毫秒数后解析,它将返回该值。 (取消注释第 3 行以进行此调试)。
这样收集者就永远不会收集到最后一个表情符号。
我也试图回报之前的承诺then
与收集器(let res = await channel.send...
),然后执行其余代码。我还保留着最后收集的表情符号。
我知道我可以使用过滤器来忽略机器人或表情符号,而只关注用户的表情符号(请参阅下面的代码),但我想知道是什么导致了这种行为。难道是我做错了什么?关于 Promise 有什么我不明白的地方吗?
function filter(reaction, user) {
if(user.id === client.user.id) { return false; } // or user.bot to ignore all bot
console.log('reacted to: ', reaction.emoji.name);
return true;
}
在我看来,在调试中看到收集器在记录所有内容后做出反应后,我认为正在解决的 Promise 和 Discord 将信息发送到收集器/回调是不同的,但这只是一个猜测
note:
Node.js版本:v11.15.0
Discord.js 版本:v11.5.1