【发布时间】:2019-12-04 01:34:55
【问题描述】:
我正在玩 message.react 函数和 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)}`);
});
});
}
调试
这个例子比我做的第一个例子要复杂一些,因为我尝试了一些调试。
示例发送一条消息,附加链式 promise 3 表情符号,然后开始收集表情符号。 但是,如以下日志所示,最后一个表情符号被收集(我自己从未按过任何表情符号,而且我一个人在我的服务器上):
First
Second [Map Iterator] { '⬅' }
Third [Map Iterator] { '⬅', '➡' }
Fourth [Map Iterator] { '⬅', '➡', '????' }
reacted to: ????
After 5 sec, only 1 out of 2 reacted: ????
但有时(视情况而定)它工作正常,日志是这样的:
First
Second [Map Iterator] { '⬅' }
Third [Map Iterator] { '⬅', '➡' }
Fourth [Map Iterator] { '⬅', '➡', '????' }
After 5 sec, only 0 out of 2 reacted:
我最后在火车上进行测试,可能是由于网络不规则。
所以我尝试了其他方法,我添加了 sleep 函数,它接受一个 ms 和一个值,并返回一个 promise,它会在 ms 量过去后返回值。 (取消注释 3 行以进行此调试)。 这样收集器就不会收集到最后一个表情符号。
我还尝试使用收集器 (let res = await channel.send...) 在 then 之前返回承诺,然后执行其余代码。我仍然收集了最后一个表情符号。
我知道我可以使用我的过滤器来忽略机器人或我的表情符号,而只关注用户的(见下面的代码),但我想知道是什么导致了这种行为。是不是我做错了什么?关于 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;
}
在我看来,在调试中看到收集器在记录所有内容后做出反应后,我认为解决的承诺和 Discord 将信息发送到收集器/回调是不同的,但这只是一个猜测
注意:
node.js 版本:v11.15.0
discord.js 版本:v11.5.1
【问题讨论】:
-
看起来像是某种不受你控制的种族效应......或者只是机器中的幽灵。
标签: node.js promise discord discord.js