我在使用async await的部分代码中遇到了一个非常奇怪的问题。这是使用 Discord.js库。
基本上,在我的服务器上有一个向新人提问的discord机器人,代码有点长,所以我只是把我有问题的部分贴出来。
问题是在DM中提问回答的。我使用的是 awaitMessages 函数,这是Discord.js所特有的。但是在这段代码中,即使计时器没有超过最大消息量,catch函数有时也会被随机调用。
这就像catch被立即调用,我不知道为什么,因为正如我所说,它似乎是随机的。
我在机器人提出的15%的问题上遇到了这个问题,对于所有其他的问题,代码进入了 awaitMessages函数的.then块,而不是 catch。
知道是什么原因导致的吗?我真的不知道这个问题是由Discord.js引起的,还是我在JavaScript逻辑中遗漏了什么。我已经在官方Discord.js的discord服务器上问过我的问题,但没有成功。
// send the question
await newmsg.channel.send(questions[i]);
// wait for the answer
await newmsg.channel.awaitMessages(m => m.author.id === user.id, { max: 1, time: 300000, errors: ["time"], })
.then(collected => {
// answer given by member. The var "collected" contains the messages collected. We use .first to get the answer given
// if questions are not canceled and the answer given is false, we stop
if(!cancel && !checkAnswer(i, collected.first()))
{
badAnswer = true;
return;
}
}).catch(async () => {
await user.send(":hourglass: **End of time**";
removeUserFromApplicants(user.id);
cancel = true;
isCanceled = true;
//console.log(`${user.username} let their application time out.`);
logMonitoring(":clock1: Time over for **" + user.username + "**.");
});
try {
await newmsg.channel.send(questions[i]);
// wait for the answer
let collected = await newmsg.channel.awaitMessages(m => m.author.id === user.id, { max: 1, time: 300000, errors: ["time"], })
if(!cancel && !checkAnswer(i, collected.first())) {
badAnswer = true; return;
}
} catch(error){
await user.send(":hourglass: **End of time**"; removeUserFromApplicants(user.id); cancel = true; isCanceled = true;
logMonitoring(":clock1: Time over for **" + user.username + "**.");
}
经过几个小时的搜索,我很遗憾地没有找到这两个块被调用的确切原因。我高度怀疑是 max: 1
导致所有这些无意义的事情。
所以我所做的是用一个 while 循环包围整个 Promise。我去掉了捕获块的 "最大时间 "功能,换句话说我清空了捕获块。我所做的是,只要catch块被调用,我们就会重新启动 "等待过程",直到机器人真的在等待消息。
如果我发现更多信息,我会更新。这个解决方案并不完美,但目前效果不错。