繁体   English   中英

我的 catch 块(异步)似乎是随机调用的

[英]My catch block (async) seems to be called randomly

我的部分代码使用 async/await 时遇到了一个非常奇怪的问题。 这是与Discord.js 库一起使用的 JavaScript 代码。

基本上,我的服务器上有一个 discord 机器人向新手提问,代码有点长,所以我只是发布我遇到问题的部分。

问题在 DM 中提出/回答。 我为此使用了awaitMessages function,它特定于 Discord.js。 但是在下面的代码中,有时会随机调用 catch function,即使计时器未结束/未达到最大消息。

就像立即调用 catch 一样,我不知道为什么,因为正如我所说,它似乎是随机的。

我在机器人提出的大约 15% 的问题上遇到了问题,对于所有其他问题,代码进入 awaitMessages function 的.then 块,而不是问题。

知道是什么原因造成的吗? 我真的不知道问题是由 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会导致所有这些胡说八道。

所以我所做的是围绕整个 Promise 循环。 我删除了 catch 块的“最大时间”功能,换句话说,我清空了块。 我所做的是,只要调用了 catch 块,我们就会重新启动“等待过程”,直到机器人真正在等待消息。

如果我找到更多信息,我会更新。 该解决方案并不完美,但目前效果很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM